2014-05-08 80 views
1
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?

+1

[不要在$(找到...)文件執行(HTTP://mywiki.wooledge .org/ParsingLs) – BroSlow

+0

這種使用'find'的方法總是會導致你使用有趣的名稱(空格,換行符,水平字符)的文件名錯誤... –

回答

0
find C:/PATH/TO/DIRECTORY -name \*.txt | while read file 
do 
    dir=$(dirname "$file") 
    base=$(basename "$file") 
    mv "$file" "$dir/new_file_name" 
done 
+0

[參數擴展](http://mywiki.wooledge。 org/BashGuide/Parameters#Parameter_Expansion)會更有效率...... – jasonwryan

+0

Omg,你將空格分隔「find」的結果,然後迭代它。你也必須引用''「$ file」''。請參閱其他答案。 –

+0

-1:在名稱中包含換行符的文件名無法正常工作,無法正確使用包含反斜槓轉義序列的文件名。 –

2

您可以使用查找-execdir選項:

find C:/PATH/TO/DIRECTORY -name '*.txt' -execdir mv '{}' '{}'-new \; 

man find

-execdir utility [argument ...] ;

的-execdir主要是相同的-exec主要用該實用程序將從direc執行 保存當前文件的tory。

+1

+1:這裏沒有任何東西積極促進任何不良做法。 (也就是說,可能值得注意的是'-execdir'不是POSIX指定的,所以有可能找到沒有提供它的實現)。 –

0

您將得到更好的使用該結構爲:

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" 

但即使這樣,如果文件名在他們報價或其他東西可能有問題。

的底線是,解析任意的數據(文件名即可)硬...

+1

我建議'讀-r',如果使用bash和帶有現代擴展名的'find'(不再限於GNU),'IFS = read -r -d'''並且'find ... - print0' –

+0

......此外,「xargs -0」的潛在引用問題究竟是什麼?我的理解是,在這種模式下,它完全按字面傳遞內容。 –

+0

@CharlesDuffy我可能是錯的,但是我想象着'somescript.sh「xxx」'部分的問題,如果'xxx'被具有特別錯誤匹配的引號或轉義字符或其他東西的東西替換。我不認爲'xargs'會在讀取條目時遇到問題,只是shell處理每個條目可能會在某些輸入上下降(特別是如果它所調用的腳本是不小心寫入的話)...另一個好點關於'read -r'和'IFS'的東西,雖然... – twalberg

相關問題