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

作者:佚名 上传时间:2019-05-14 版权申诉

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   

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

方法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

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

上面脚本只能将文件名中间有空格的替换为下划线。那么如何解决文件名后有空格的情况呢? 可以用其它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

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

如上所示,虽然 文件名中间的空格被替换为了下划线,但是后面的空格没有替换为下划线,而是将那些空格直接截断了。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]# 

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

其实,这个是因为读取文件名是$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]# 

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

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

方案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

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
Linux
Linux如何查找处理文件名后包含空格的文件
Linux查找处理文件名包含空格文件两种方法
在linux中如何查找处理文件名后包含空格的文件呢?怎么批量替换处理这些空格呢?下面小编给大家带来了两种方法,需要的朋友参考下吧
PDF
82KB
2020-10-30 10:07
awk命令
在处理包含空格的文件名时,可以使用awk的单引号来确保文件名被正确解释。例如,假设文件名为\"file with spaces.txt\",你可以这样使用awk命令:awk '{print $1}
任何版本
awk
2024-03-04 17:16
使用awk时
在awk中处理包含空格的文件名时,可以通过设置字段分隔符(FS)来解决这个问题。默认情况下,awk使用空格作为字段分隔符,但是当文件名中包含空格时,这会导致awk错误地将文件名分割成多个字段。为了处理
任意版本
awk
2023-11-24 14:14
使用awk时,
在awk中处理包含空格的文件名需要特殊的注意。由于默认情况下,awk使用空格来分隔字段,因此文件名中的空格可能会导致awk将其视为多个字段而引发问题。为了解决这个问题,你可以使用-F选项来指定不同于默
常用软件
常用软件
2023-11-14 20:35
Linux和特殊字符
我们经常会看到文件名和文件夹名。大多数时候文件/文件夹的名字和内容相关并以数字和字母开头。字母加数字的文件名最常见,应用也很广泛,但总会需要处理一些包含特殊字符的文件名/文件夹名。
Shell脚本中情况?
在Shell脚本中处理文件名包含空格的问题可以通过引号来解决。当文件名包含空格时,需要确保在引用文件名的地方使用双引号或单引号来包裹文件名。这可以防止空格被解释为分隔符,从而导致意外的结果。以下是一些
所有Shell版本
Shell
2024-03-06 01:42
Shell脚本中情况?
在Shell脚本中处理文件名中包含空格的情况需要特殊注意。一种解决方法是在处理文件名时使用引号将其括起来,这样Shell就能正确识别文件名中的空格而不将其视为分隔符。举例来说,如果你想要迭代处理目录中
软件版本
Shell
2023-11-27 17:46
使用awk时列?
在处理包含空格的列时,可以使用awk的-F选项来指定字段分隔符。默认情况下,awk使用空格作为字段分隔符,但是当列中包含空格时,就需要手动指定分隔符。例如,如果文件的列是用制表符分隔的,可以使用awk
所有版本
awk
2023-11-29 23:30
在使用Shell脚本时情况?
当文件名中包含空格时,在Shell脚本中处理起来可能会比较麻烦,但我们可以通过引用文件名来解决这个问题。通常,将文件名用双引号括起来是最简单的解决方法。例如,如果你有一个文件名为\"file with
任何Shell版本
Shell
2024-03-06 22:26