Linux

根據目錄名重命名文件

  • November 6, 2019
for i in L*;
do
cd $i
find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename 's/botrytis_cinerea_T12345/"$i"/g' {} \;
done

我得到錯誤

find: missing argument to `-exec' rename: not enough arguments

Usage:  rename [options] expression replacement file...

Options:  -v, --verbose    explain what is being done  -s, --symlink   act on symlink target

-h, --help     display this help and exit  -V, --version  output version information and exit

For more details see rename(1).

有兩個rename具有不同語法的常用命令。您正在使用為接受 Perl 表達式的版本編寫的腳本:

rename s/expression/replacement/g file...

但是您安裝的那個是同時接受正則表達式和替換字元串的那個,正如您看到的錯誤消息所暗示的那樣:

rename [options] expression replacement file...

(算你幸運或聰明,你用它\;代替+.)你可以通過調整你的find命令來解決這個問題:

find . -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;

正如 Kusalananda 在評論中指出的那樣,您也在cd循環中,但永遠不會回到原始目錄,因此在第一次迭代之後的每次迭代,您都會反复嘗試到cd一個不存在的目錄。cd您可能會嘗試通過在之後做另一個來解決此問題find,但我可能會嘗試通過調整find自身來避免這種情況:

for i in L*; do
   find "$i" -type f -name 'botrytis_cinerea_T12345.*' -exec rename botrytis_cinerea_T12345 "$i" {} \;
done

也可以看看

引用自:https://unix.stackexchange.com/questions/550720