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. GTID复制详解

    前言 GTID复制是MySQL 5.6后的新功能,在传统的方式里,主从切换后,需要找到binlog和POS点,然后执行命令change master to 指向新的主库.对于不是很有经验的人来说,往往 ...

  2. python selenium 鼠标悬停

    #鼠标悬停 chain = ActionChains(driver) implement = driver.find_element_by_link_text() chain.move_to_elem ...

  3. 康盛(discuz )牛逼的PHP加解密算法函数

    1.前言 康盛的 authcode 函数很牛叉,是一个具有有效期的加解密函数,同一个字符每次加密所产生的结果都是不一致的,并且可以自定义设置过期时间. 设计原理:authcode 是使用异或运算进行加 ...

  4. vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录

    一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...

  5. angular js $post,$get请求传值

    困扰了我好几天的问题!!! 刚开始学play框架,在向后台传值时,一直不成功! 当你用$POST传递一个参数时: HTML: <button ng-click=test()>测试</ ...

  6. thinkpadE470 win10安装虚拟机时出现‘intel VT-x’处于禁用状态 无法执行64位操作系统

    上图为安装虚拟机时弹出的问题. 解决办法: 本人电脑型号为thinkpadE470.遇到此问题查阅了很多,都是针对一般电脑的.折腾了好一会儿.故特写一篇针对此型号的. 1.重启计算机,一开始出现联想标 ...

  7. 济南清北学堂游记 Day 5.

    十一月的第一天.算下来在济南已经呆了接近一星期了...... 还剩九天...看着洛谷的倒计时心里直发慌. 也许我不该过多纠结于高级算法,基础也是很重要的. 今天晚上就自由的敲一些板子吧.最后的九天,让 ...

  8. WebSocket 示例

    websocket应运而生 在WebSocket规范提出之前,开发人员若要实现带有即时通信.实时数据.订阅推送等功能的应用实时性较强的功能,经常会使用的解决方法是 Comet. Comet是一种服务器 ...

  9. SpringMVC之HelloWorld实例

    1.1 Helloworld实例的操作步骤  1. 加入jar包 2. 配置dispatcherServlet 3. 加入Spring配置文件 4. 编写请求处理器 并表示为处理器 5. 编写视图 1 ...

  10. java Mac自动化-java和ant环境搭建

    本文旨在帮助读者介绍,如果一个测试工程师拿到了mac本,该如何在本地搭建java和ant环境 其实在几年前,我们还大多使用的是windows本,而且我们也会比较善于使用windows笔记本,但自从ma ...