2013-10-22 89 views
0

我有一個腳本,它應該通過它的執行目錄和子目錄,搜索特定的文件類型,比如說pdf,然後刪除它們,然後用刪除的文件名創建一個空文件。 它工作正常,只是它忽略文件和文件夾,它們的名稱中包含空格。 下面是腳本:爲什麼在bash中忽略名稱中空格的文件和目錄?

#!/bin/sh 

# 
# Created by User on 6/20/11. 
# 

dir=./ 
for files in $(find -L "$dir" -name '*.pdf' -mtime +90); 
do 
echo $files 
rm -fR $files 
touch $files.removed 
done 

任何一個可以提出一個解決方案如何使這個腳本照顧所有文件和文件夾的任何樣的名字?

感謝和問候

回答

3

IFS默認值在遇到空格會導致分詞。你說:

for files in $(IFS=$'\n' find -L "$dir" -name '*.pdf' -mtime +90); 

IFS=$'\n'以上會導致分詞就換行纔會發生,所以有空格的文件名會很好地工作。

+0

非常感謝,解決了這個問題。 :-) –

2

我建議讓您的腳本,這種方式並使用雙引號:

dir=./ 
while read files 
do 
    echo "$files" 
    rm -fR "$files" 
    touch "$files".removed 
done < <(find -L "$dir" -name '*.pdf' -mtime +90) 
0

你做詢問任何名。一個合法的文件名可以包含一個換行符,因此任何假定換行都會分開兩個文件名的解決方案並不完全正確。只有兩個不能出現在文件名中的字符是/(用於分隔路徑組件)和空字符。

如果你的的find版本支持它,你可以使用

find -L "$dir" -name '*.pdf' -mtime +90 -print0 

爲了處理此獲取文件名的空分隔的列表,你需要xargs

find -L "$dir" -name '*.pdf' -mtime +90 -print0 | 
    xargs -0 -I %% sh -c 'echo "%%"; rm -fR "%%"; touch "%%.removed"' 

如果你的find不支持-print0,你可以使用-exec初級很像xargs

find -L "$dir" -name '*.pdf' -mtime +90 -exec sh -c 'echo "{}"; rm -fR "{}"; touch "{}.removed"' 
相關問題