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. matlab判断文件或文件夹是否存在

    当前目录中包含以下文件及文件夹: startup.m win64/ … 判断当前目录中是否存在startup.m文件 if ~exist('startup.m','file')==0    error ...

  2. HTML学习——表单标签

    1.type: 当 type="radio" 时,控件为单选框 当 type="checkbox" 时,控件为复选框 2.value:提交数据到服务器的值(后台 ...

  3. postgres允许别人访问连接配置

  4. iOS-RAC从新手开始

    什么是RAC? 其实RAC就是一个简化代码的第三方库ReactiveCocoa,直接用Cocoapods添加到项目里就可以, podfile 文件添加 pod 'ReactiveCocoa',然后终端 ...

  5. 2017年总结的前端文章——CSS盒模型详解

    CSS的盒模型是CSS的基础,同时也是难点,这个问题经常在面试中会被问到,属于经典问题了.很多博客里讲得也很模糊不清,于是,我在这里重新整理一下. 可以认为每个html标签都是一个方块,然后这个方块又 ...

  6. 深入理解Python字符编码--转

    http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...

  7. c++类的基础

    1.抽象: 抽象出公有特性,包括公有动作,公有数据. 2.类:类是具有相同属性和行为的一组对象的集合(变量和函数) 声明格式: class 类名(Dog) { 类体:(数据和函数成员)默认为私有成员, ...

  8. 高可用Redis服务架构分析与搭建

    基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...

  9. shiro权限控制的简单实现

    权限控制常用的有shiro.spring security,两者相比较,各有优缺点,此篇文章以shiro为例,实现系统的权限控制. 一.数据库的设计 简单的五张表,用户.角色.权限及关联表: CREA ...

  10. 前端js代码优化

    今天给大家分享下js代码优化的相关技巧. 1.使用"+"转换为数值     我们平时开发过程中需要将数字字符串创转为number类型,大多数都会用JavaScript parseI ...