Linux如何查找处理文件名后包含空格的文件

 

当Linux下文件名中出现空格这类特殊情况话,如何查找或确认那些文件名后有空格呢? 又怎么批量替换处理掉这些空格呢?

方法1: 输入文件名后使用Tab键,如果使用Tab键后面出现\ \ \这样的可见字符,那么该文件名包含空格。当然,这个方法弊端很大,例如,效率低下,不能批量查找,只有当你怀疑某个文件名后有空格,这个方法才比较凑效。另外,不能查找文件中间包含空格的文件名。如下测试所示:

[root@DB-Server kerry]# cat >"test.txt    "

it is only for test!

 

[1]+  Stopped                 cat > "test.txt    "

[root@DB-Server kerry]# cat >"tes t.txt"

it is only for test too!

 

[2]+  Stopped                 cat > "tes t.txt"

[root@DB-Server kerry]# ls test.txt

ls: test.txt: No such file or directory

[root@DB-Server kerry]# ls test

test~         test1.py      test.py       test.sh       test.txt      

[root@DB-Server kerry]# ls test.txt\ \ \ \  

test.txt    

[root@DB-Server kerry]# ls tes

test~         test1.py      test.py       test.sh       tes t.txt     test.txt   

方法2: 使用find命令查找文件名中包含空格的文件。

[root@DB-Server kerry]# find . -type f -name "* *" -print

./test.txt

./tes t.txt

那么如何将这些空格替换掉呢?  下面脚本可以替换文件中间的空格,用下划线替换空格,但是只能替换文件中间的空格,并不能替换文件名后面的空格。如下测试所示:

find . -type f -name "* *" -print |

while read name; do

na=$(echo $name | tr ' ' '_')

if [[ $name != $na ]]; then

mv "$name" "$na"

fi

done

上面脚本只能将文件名中间有空格的替换为下划线。那么如何解决文件名后有空格的情况呢? 可以用其它shell脚本实现,如下所示:

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"test.txt    "

12

[root@DB-Server kerry]# cat >"tes t.txt"

12

[root@DB-Server kerry]# find . -type f -name "* *" -print

./test.txt    

./tes t.txt

[root@DB-Server kerry]# for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

[root@DB-Server kerry]# ls -lrt

total 8

-rw-r--r-- 1 root root 0 Nov 13 10:04 test.txt

-rw-r--r-- 1 root root 0 Nov 13 10:04 tes_t.txt

如上所示,虽然文件名中间的空格被替换为了下划线,但是后面的空格没有替换为下划线,而是将那些空格直接截断了。Why?下面使用sed命令也是如此

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"test.txt    "

12

[root@DB-Server kerry]# cat >"tes t.txt"

12

[root@DB-Server kerry]# find . -type f -name "* *" -print

./test.txt    

./tes t.txt

[root@DB-Server kerry]# for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

[root@DB-Server kerry]# ls -lrt

total 8

-rw-r--r-- 1 root root 0 Nov 13 09:29 test.txt

-rw-r--r-- 1 root root 0 Nov 13 09:29 tes_t.txt

[root@DB-Server kerry]# 

[root@DB-Server kerry]# 

其实,这个是因为读取文件名是$file 与"$file"是不同的,$file不会识别文件名后面的空格,而"$file"才会失败文件名后面的空格。所以上面脚本其实只是取巧而已。

[root@DB-Server kerry]# rm -rf *;

[root@DB-Server kerry]# cat >"test.txt    "

123

[root@DB-Server kerry]#  for file in *; do echo "$file"; echo "$file" | wc -m ;   done;

test.txt    

13

[root@DB-Server kerry]#  for file in *; do echo $file; echo $file | wc -m ;   done;

test.txt

9

[root@DB-Server kerry]# 

所以,正确的替换空格的命令应该为如下:

方案1:

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"test.txt    "

123456

 

[root@DB-Server kerry]# find . -type f -name "* *" -print

./test.txt    

[root@DB-Server kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' '\n'` ; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

[root@DB-Server kerry]# ls test.txt

test.txt

[root@DB-Server kerry]# 

方案2:

[root@DB-Server kerry]# 

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"test.txt    "

123456

 

[root@DB-Server kerry]# for file in *' '*; do   mv "$file" `echo "$file" | sed -e 's/ /n/g'`; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

但是对于文件名中间包含空格的情况,上面两个脚本都无法完美解决。如下所示:

[root@DB-Server kerry]# 

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"tes t.txt"

123456

 

[root@DB-Server kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' '_'` ; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

[root@DB-Server kerry]# ls -lrt 

total 8

-rw-r--r-- 1 root root 7 Nov 13 16:00 tes_t.txt

[root@DB-Server kerry]# 

 

 

[root@DB-Server kerry]# rm -rf *

[root@DB-Server kerry]# cat >"tes t.txt"

123456

[root@DB-Server kerry]# cat >"test.txt    "

654321

 

[root@DB-Server kerry]# find . -type f -name "* *" -print

./test.txt    

./tes t.txt

[root@DB-Server kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' '_'` ; done

[root@DB-Server kerry]# find . -type f -name "* *" -print

[root@DB-Server kerry]# ls -lrt

total 12

-rw-r--r-- 1 root root 0 Nov 13 15:59 tes_t.txt

-rw-r--r-- 1 root root 7 Nov 13 15:59 test.txt____

当然对于这两种特殊情况,上面脚本都不能一起处理,如上所示,后面的空格会被替换成了下划线。这反而不是我们想要的,反而最上面的那两种脚本,可以误打误撞的解决这两种问题。当然让前提是你得知其然知其所以然!

 

参考资料:

http://www.eygle.com/digest/2006/11/linux_replace_blank.html

https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names

https://www.keakon.net/2011/10/20/bash%E4%B8%8B%E5%A4%84%E7%90%86%E5%8C%85%E5%90%AB%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D

Linux如何查找处理文件名后包含空格的文件的更多相关文章

  1. Shell 处理文件名中包含空格的文件

    最近在学Gradle, 使用git clone 命令下载了一些资料,但是文件名含有空格,看上去不是很舒服,因此想到用shell脚本对其进行批处理,去掉文件名中的空格,注意这里是把所有的空格全去掉 gi ...

  2. linux下rm命令删除文件名中包含特殊字符的文件【转】

    转自:http://blog.itpub.net/143526/viewspace-1060083/ 1. 删除带“-”的文件名的方法 2. 删除包含其它特殊字符的文件 3. 删除系统打不出的乱码文件 ...

  3. Linux下怎么创建和进入带有空格的文件夹

    有时候需要创建带有空格的文件夹,虽然这不是一个好的习惯,但是偶尔会遇到.用的最多的是很多时候需要进入带有空格的文件夹,如"a b"是一个文件夹名. 创建:mkdir "a ...

  4. linux下查找某个目录下包含某个字符串的文件

    有时候要找一些字符串,但是又不知道在哪个文件,只记得一些字符串 那么如何在linux下寻找包含某段文字的文件呢? 强大的find命令可以帮你完成不可能的任务. 比如我只记得我的程序里包含唯一的字符串“ ...

  5. 一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!

    最近负责公司研究新的多渠道打包方案,之前的打包方案太慢了,因此采用了美团的Android Signature V2 Scheme签名下的新一代渠道包打包神器 方案进行了多渠道打包.但是由于马虎,在配置 ...

  6. Linux查看当前目录下文件名中包含指定字符的文件

    find . -type f -name "edaijia* 结果:

  7. Linux如何查找某个时间点后生成的空文件

    今天遇到一个特殊需求,需要找到某天(例如2017-04-13)以及这之后生成的空文件.那么这个要怎么处理呢?这个当然是用find命令来解决.如下所示, -mtime -5 表示查找距现在 5*24H ...

  8. Linux 下如何处理包含空格和特殊字符的文件名

    Linux 下如何处理包含空格和特殊字符的文件名 作者: Avishek Kumar 译者: LCTT zpl1025 | 2015-07-08 07:47   评论: 12 收藏: 9 分享: 1 ...

  9. Linux find 查找 并删除文件 杀掉进程

    find 默认在当前 即 . 目录下查找 du 文件名 / 目录 # 查看文件占用内存大小 1. 按照文件名查找 find / -name qwe # qwe为文件名 find / -name *qw ...

随机推荐

  1. Part 7:自定义admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  2. Jmeter之性能压测Stepping Thread Group 逐步增加并发数 阶梯式加压并发 (十五)

    前段时间有描述过性能的测试类型 配置负载 Big Bang: 负载同时产生 Ramp up: 开始时候产生一定负载,然后每隔一段时间增加一些负载直到达到目标负载,这是典型模式 Ramp-up (wit ...

  3. 基于线程池的线程管理(BlockingQueue生产者消费者方式)实例

    1.线程池管理类: public class ThreadPoolManager { private static ThreadPoolManager instance = new ThreadPoo ...

  4. Effective Java 之-----消除过期的对象引用

    public class Stack { private Object[] elements; private int size = 0; private static final int DEFAU ...

  5. 使用JavaScript实现机器学习和神经学网络

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载heaton-javascript-ml.zip - 45.1 KB 基本介绍 在本文中,你会对如何使用JavaScript实现机器学习这个 ...

  6. BZOJ 3991: [SDOI2015]寻宝游戏 [虚树 树链的并 set]

    传送门 题意: $n$个点的树,$m$次变动使得某个点有宝物或没宝物,询问每次变动后集齐所有宝物并返回原点的最小距离 转化成有根树,求树链的并... 两两树链求并就可以,但我们按照$dfs$序来两两求 ...

  7. 在Android上编写模块化项目(翻译)

    来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...

  8. Netty(一):入门篇

    匠心零度 转载请注明原创出处,谢谢! 说在前面 上篇文章对Netty进行了初探:Netty初探,主要介绍了下我们为什么需要学习netty.netty介绍等:本篇文章接着上篇文章的内容.本篇为了方便大家 ...

  9. ES6,数组遍历

    ES6提供了entries(),keys(),values()方法返回数组的遍历器,对于遍历器(Iterator)可以使用for...of进行便利,也可是使用entries()返回的遍历器Iterat ...

  10. Visual Studio Code 调整字体大小

    { "editor.fontSize": 14, "window.zoomLevel": 1, } // 将设置放入此文件中以覆盖默认设置 { , , #代码字 ...