收藏本站 收藏本站
積木網首頁 - 軟件測試 - 常用手冊 - 站長工具 - 技術社區
首頁 > shell編程 > 正文

首頁 - PHP - 數據庫 - 操作系統 - 游戲開發 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell編程 - DOS命令 - jQuery - CSS樣式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

Linux查找處理文件名后包含空格的文件(兩種方法)

當Linux下文件名中出現空格這類特殊情況話,如何查找或確認那些文件名后有空格呢? 又怎么批量替換處理掉這些空格呢?

方法1:

輸入文件名后使用Tab鍵,如果使用Tab鍵后面出現 這樣的可見字符,那么該文件名包含空格。當然,這個方法弊端很大,例如,效率低下,不能批量查找,只有當你懷疑某個文件名后有空格,這個方法才比較湊效。另外,不能查找文件中間包含空格的文件名。如下測試所示:

[[email protected] kerry]# cat >"test.txt "
it is only for test!
[1]+ Stopped   cat > "test.txt "
[[email protected] kerry]# cat >"tes t.txt"
it is only for test too!
[2]+ Stopped   cat > "tes t.txt"
[[email protected] kerry]# ls test.txt
ls: test.txt: No such file or directory
[[email protected] kerry]# ls test
test~  test1.py test.py test.sh test.txt 
[[email protected] kerry]# ls test.txt    
test.txt 
[[email protected] kerry]# ls tes
test~  test1.py test.py test.sh tes t.txt test.txt 

查看圖片

方法2:

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

[[email protected] 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腳本實現,如下所示:

[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"test.txt "
12
[[email protected] kerry]# cat >"tes t.txt"
12
[[email protected] kerry]# find . -type f -name "* *" -print
./test.txt 
./tes t.txt
[[email protected] kerry]# for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
[[email protected] kerry]# find . -type f -name "* *" -print
[[email protected] 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命令也是如此

[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"test.txt "
12
[[email protected] kerry]# cat >"tes t.txt"
12
[[email protected] kerry]# find . -type f -name "* *" -print
./test.txt 
./tes t.txt
[[email protected] kerry]# for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
[[email protected] kerry]# find . -type f -name "* *" -print
[[email protected] 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
[[email protected] kerry]# 
[[email protected] kerry]#

查看圖片

其實,這個是因為讀取文件名是$file 與"$file"是不同的,$file不會識別文件名后面的空格,而"$file"才會失敗文件名后面的空格。所以上面腳本其實只是取巧而已。

[[email protected] kerry]# rm -rf *;
[[email protected] kerry]# cat >"test.txt "
123
[[email protected] kerry]# for file in *; do echo "$file"; echo "$file" | wc -m ; done;
test.txt 
13
[[email protected] kerry]# for file in *; do echo $file; echo $file | wc -m ; done;
test.txt
9
[[email protected] kerry]# 

查看圖片

所以,正確的替換空格的命令應該為如下:

方案1:

[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"test.txt "
123456
[[email protected] kerry]# find . -type f -name "* *" -print
./test.txt 
[[email protected] kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' 'n'` ; done
[[email protected] kerry]# find . -type f -name "* *" -print
[[email protected] kerry]# ls test.txt
test.txt
[[email protected] kerry]# 

方案2:

[[email protected] kerry]# 
[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"test.txt "
123456
[[email protected] kerry]# for file in *' '*; do mv "$file" `echo "$file" | sed -e 's/ /n/g'`; done
[[email protected] kerry]# find . -type f -name "* *" -print 

但是對于文件名中間包含空格的情況,上面兩個腳本都無法完美解決。如下所示:

[[email protected] kerry]# 
[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"tes t.txt"
123456
[[email protected] kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' '_'` ; done
[[email protected] kerry]# find . -type f -name "* *" -print
[[email protected] kerry]# ls -lrt 
total 8
-rw-r--r-- 1 root root 7 Nov 13 16:00 tes_t.txt
[[email protected] kerry]# 
[[email protected] kerry]# rm -rf *
[[email protected] kerry]# cat >"tes t.txt"
123456
[[email protected] kerry]# cat >"test.txt "
654321
[[email protected] kerry]# find . -type f -name "* *" -print
./test.txt 
./tes t.txt
[[email protected] kerry]# for file in *; do mv "$file" `echo "$file" | tr ' ' '_'` ; done
[[email protected] kerry]# find . -type f -name "* *" -print
[[email protected] 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____

當然對于這兩種特殊情況,上面腳本都不能一起處理,如上所示,后面的空格會被替換成了下劃線。這反而不是我們想要的,反而最上面的那兩種腳本,可以誤打誤撞的解決這兩種問題。當然讓前提是你得知其然知其所以然!

shell編程跨服務器備份文件
本文實例為大家分享了shell跨服務器備份文件的具體代碼,供大家參考,具體內容如下需求:查詢某個文件夾下的所有文件,將文件修改時間小于當前時

通過Spring Shell 開發 Java 命令行應用
提到Java,大家都會想到Java在服務器端應用開發中的使用。實際上,Java在命令行應用的開發中也有一席之地。在很多情況下,相對于圖形用戶界面來說

shell中的source命令的巧妙用法
首先,通常用于重新執行剛修改的初始化文件,使之立即生效,而不必注銷并重新登錄。例如,當我們修改了/etc/profile文件,并想讓它立刻生效,而不

本周排行

更新排行

強悍的草根IT技術社區,這里應該有您想要的! 友情鏈接:b2b電子商務
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP備05050695號
手游棋牌游戏运营
湖南快乐十分预测推荐 老时时重庆 手机看最快的开奖结果 极速时时九码技巧 江西时时彩计划 广西快快乐十分今天开奖结果 排5开奖号码 江西快三基本走势图一定牛 河北快3开奖号是多少 四川时时走势图号码 今晚特马17开奖结果 广东省快乐十分开奖结果查询 广东时时怎么买 欢乐生肖福彩 pc蛋蛋幸运28走势图怎么看 辽宁福彩快乐12选五开奖结果