2017-08-16 57 views
-3

我試圖將一些文件重命名爲另一分機:如何在bash中使用通配符重命名文件?

# mv *.sqlite3_done *.sqlite3 

,但得到了一個錯誤:

mv: target '*.sqlite3' is not a directory 

爲什麼?

+1

我覺得這已經在這裏找到答案: https://stackoverflow.com/questions/26519301/bash-error-renaming-files-with-spaces-mv -target-is-not-a-directory是否爲你分類? – Grey

回答

1

通配符擴展會導致傳遞給該命令的多個名稱。 shell認爲你正嘗試將多個文件移動到*.sqlite3目錄。

你需要使用一個循環:

for nam in *sqlite3_done 
do 
    newname=${nam%_done} 
    mv $nam $newname 
done 

%_done說,從字符串中刪除的_done最後一次出現。

如果你的文件名中可能有空格,你會引用文件名。

4

mv只能將多個文件移動到一個目錄中;它不能將每一個移動到不同的名稱。你可以在bash循環,而不是:

for x in *.sqlite3_done; do 
    mv "$x" "${x%_done}" 
done 

${x%_done}$x結束刪除_done

0

最簡單的方式是利用找到

find . -type f -name '*.sqlite3_done' -exec sh -c 'x="{}"; mv "$x" "${x%_done}"' \;