Bash

刪除文件夾中所有文件名的一部分?

  • July 9, 2018

我的相機以以下格式儲存照片:

DSC_0001 (2015_07_30 10_34_56 UTC).NEF

使用 DSC_ 迭代之後的數字,以及指定時間和日期的括號,但是所有時間和日期資訊都在元數據中,所以我希望將它生成的所有文件重命名為:

DSC_0001.NEF etc

我已經查看了renamebash 中的命令,但不明白如何讓它做我想做的事,我想更改文件夾中的所有文件。

如果你能解釋為什麼你的建議有效,我將不勝感激,這樣我就可以嘗試學習如何在未來解決類似的問題。

**注意:**如果有什麼不同,我正在使用 Bash。

使用 Perl 重命名工具:

rename 's/ \(.*?\)//' *.NEF

正則表達式應該簡單明了(.*?匹配最短的字元串)。

很難看出為什麼 Debian/Ubuntu 上的重命名實用程序與其他發行版(如 CentOS)上的不同?關於兩個不同的rename命令。

如果文件位於沒有子目錄的單個photos文件夾中,並且該文件夾名為:

for pathname in photos/*(*).NEF; do
   newname=${pathname##*/}
   newname=${newname%% '('*}.NEF

   printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
   # mv -i "$pathname" "${pathname%/*}/$newname"
done

這將遍歷photos名稱中包含 a(並以 . 結尾的所有文件名).NEF。通過從目前路徑名中剝離目錄名,然後刪除␣((空格和)之後的所有內容並在名稱末尾(添加來創建新文件名。.NEF

為安全起見,文件的實際重命名已被註釋掉。

上面程式碼的範例輸出:

Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"

如果文件位於較大目錄結構中的某個位置:

find photos -type f -name '*(*).NEF' -exec sh -c '
   for pathname do
       newname=${pathname##*/}
       newname=${newname%% \(*}.NEF

       printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
       # mv -i "$pathname" "${pathname%/*}/$newname"
   done' sh {} +

這裡唯一的區別是為循環生成相關文件的路徑名的方式。在這種情況下,find會將批量找到的路徑名傳遞給循環,但循環本身與此答案的第一位相同(對引用進行了一些小的修改)。

有關的:

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