files=`find C:/PATH/TO/DIRECTORY -name *.txt`
for file in $files; do
#need code to rename $file, by moving it into the same directory
例如。 $文件在C:/ PATH/TO/DIRECTORY/2014-05-08中找到。 如何將$文件重命名爲該目錄而不是C:/ PATH/TO/DIRECTORY?
files=`find C:/PATH/TO/DIRECTORY -name *.txt`
for file in $files; do
#need code to rename $file, by moving it into the same directory
例如。 $文件在C:/ PATH/TO/DIRECTORY/2014-05-08中找到。 如何將$文件重命名爲該目錄而不是C:/ PATH/TO/DIRECTORY?
find C:/PATH/TO/DIRECTORY -name \*.txt | while read file
do
dir=$(dirname "$file")
base=$(basename "$file")
mv "$file" "$dir/new_file_name"
done
[參數擴展](http://mywiki.wooledge。 org/BashGuide/Parameters#Parameter_Expansion)會更有效率...... – jasonwryan
Omg,你將空格分隔「find」的結果,然後迭代它。你也必須引用''「$ file」''。請參閱其他答案。 –
-1:在名稱中包含換行符的文件名無法正常工作,無法正確使用包含反斜槓轉義序列的文件名。 –
您可以使用查找-execdir
選項:
find C:/PATH/TO/DIRECTORY -name '*.txt' -execdir mv '{}' '{}'-new \;
按man find
:
-execdir utility [argument ...] ;
的-execdir主要是相同的-exec主要用該實用程序將從direc執行 保存當前文件的tory。
+1:這裏沒有任何東西積極促進任何不良做法。 (也就是說,可能值得注意的是'-execdir'不是POSIX指定的,所以有可能找到沒有提供它的實現)。 –
您將得到更好的使用該結構爲:
while read fname
do
....
done < <(find ...)
或者,如果你不使用bash
:
find ... | while read fname
do
....
done
與存儲在的find
輸出的問題變量,或者甚至做for fname in $(find ...)
,用空白分詞。如果你有一個帶有換行符的文件名,上面的結構仍然失敗,因爲它們假設你每行有一個文件名,但是它們比現在好。
一個更好的解決辦法是這樣的:
find ... -print0 | xargs -0 -n1 -Ixxx somescript.sh "xxx"
但即使這樣,如果文件名在他們報價或其他東西可能有問題。
的底線是,解析任意的數據(文件名即可)硬...
我建議'讀-r',如果使用bash和帶有現代擴展名的'find'(不再限於GNU),'IFS = read -r -d'''並且'find ... - print0' –
......此外,「xargs -0」的潛在引用問題究竟是什麼?我的理解是,在這種模式下,它完全按字面傳遞內容。 –
@CharlesDuffy我可能是錯的,但是我想象着'somescript.sh「xxx」'部分的問題,如果'xxx'被具有特別錯誤匹配的引號或轉義字符或其他東西的東西替換。我不認爲'xargs'會在讀取條目時遇到問題,只是shell處理每個條目可能會在某些輸入上下降(特別是如果它所調用的腳本是不小心寫入的話)...另一個好點關於'read -r'和'IFS'的東西,雖然... – twalberg
[不要在$(找到...)文件執行(HTTP://mywiki.wooledge .org/ParsingLs) – BroSlow
這種使用'find'的方法總是會導致你使用有趣的名稱(空格,換行符,水平字符)的文件名錯誤... –