我想用'*doc*'重命名幾個檔案夾中檔案名含有'*file*'的所有檔案。我已經嘗試了
找到. -name "*file*" -exec mv {}`echo {} | sed "s/file/doc/"` 。
但得到一個錯誤(見下文)。
~$ ls
my_file_1.txt my_file_2.txt my_file_3.txt
~$ find . -name "*file*"
./my_file_1.txt
./my_file_3.txt
./my_file_2.txt
~$ echo my_file_1.txt | sed "s/file/doc/"
my_doc_1.txt
~$ find . -name "*file*" -exec echo {} ;
./my_file_1.txt
./my_file_3.txt
./my_file_2.txt
~$ find . -name "*file*" -exec mv {} `echo {} . | sed "s/file/doc/"` ;
mv: './my_file_1.txt' 和 './my_file_1.txt' 是同一個檔案
mv: './my_file_3.txt' 和 './my_file_3.txt' 是同一個檔案
mv: './my_file_2.txt' 和 './my_file_2.txt' 是同一個檔案
十分感謝您的幫助!
uj5u.com熱心網友回復:
有一千種方法可以做到這一點,我會用Perl來做,像這樣的方法就可以了:
找到檔案 -type f -name "file*" | perl -ne 'chomp; $f=$_; $f=~s//file//doc/; `mv $_ $f`;'
-ne對每一行的輸入進行行內腳本處理chomp清理一個新行 。
$f是新的檔案名,與舊檔案名相同 。
s//file/doc/在新檔案名中用"/doc "替換"/file" 。
mv $_ $f通過運行一個帶有后綴的作業系統命令來重命名檔案 。
uj5u.com熱心網友回復:
你的解決方案的問題是,echo {} | sed "s/file/doc/"在find命令的其余部分之前被執行。我試著做了一個命令來證明這一點:
當 下面的解決方案是使用 uj5u.com熱心網友回復: 看看你是否有 如果不是基于
標籤:find.
find . -name "." -exec date ; -exec echo `date; sleep 5` ;
date命令從左到右執行時,日期將是相等的。然而,第二個date和sleep在find啟動第一個date之前被執行。
結果:Wed Aug 25 22:33:43 XXX 2021
8月25日星期三 22:33:38 XXX 2021
print0和xargs -0來處理帶新行的檔案名。xargs將echo mv命令加上兩條斜線。
這些斜線將被sed命令發現,改變目標檔案名。
sed的結果被一個新的bash shell所決議。find . -name "*file1*" -print0 2>/dev/null |.
xargs -0 -I {} echo mv '"{}"' //'"{}"' |
sed -r 's#//(.*)file(.*)#1doc2#' !
bash
rename命令。如果它是基于perl:# -n 是測驗用的,實際重命名時去掉它。
find -name '*file*' -exec rename -n 's/file/doc/' {}.
perl,看看這是否有效:# remove --no-act --verbose for actual renaming。
find -name '*file*' -exec rename --no-act --verbose 'file' 'doc' {}.
