Bash
刪除文件夾中所有文件名的一部分?
我的相機以以下格式儲存照片:
DSC_0001 (2015_07_30 10_34_56 UTC).NEF
使用 DSC_ 迭代之後的數字,以及指定時間和日期的括號,但是所有時間和日期資訊都在元數據中,所以我希望將它生成的所有文件重命名為:
DSC_0001.NEF etc
我已經查看了
rename
bash 中的命令,但不明白如何讓它做我想做的事,我想更改文件夾中的所有文件。如果你能解釋為什麼你的建議有效,我將不勝感激,這樣我就可以嘗試學習如何在未來解決類似的問題。
**注意:**如果有什麼不同,我正在使用 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
會將批量找到的路徑名傳遞給循環,但循環本身與此答案的第一位相同(對引用進行了一些小的修改)。有關的: