[英]How to rename all .jpg files in all subdirs which contains dash in linux?
我有帶破折號的子文件夾(例如名為cd 的子目錄)。 我需要用所有子目錄重命名所有 .jpg 文件,有什么提示怎么做嗎?
我嘗試了很多選項,但沒有任何幫助(我認為是因為我的子文件夾包含破折號- )
$RANDOM
可以讓你發生碰撞。 讓我們改用 md5 校驗和哈希,因為它們看起來是隨機的,但由內容決定(這意味着只有當您擁有相同的文件時才會發生沖突)。
while IFS= read -r -d '' file; do
mv "$file" "${file%/*}/$( md5sum "$file" |awk '{print $1}' )".jpg
done < <(find . -name '*.jpg' -print0)
這需要每個文件內容的 md5 校驗和並將文件重命名為它,保留目錄結構和尾隨.jpg
由於需要保留空間,這看起來有點難看。
while IFS=
循環內容時運行,沒有輸入字段分隔符 ( $IFS
)。 每次迭代都會調用read -r -d '' file
,它讀取由空字符分隔的內容,同時忽略反斜杠轉義並將條目存儲在名為$file
的變量中。
跳到循環的末尾,您可以看到它在find
名為*.jpg
文件的find
命令的以空字符結尾的輸出上進行迭代。 這是通過Bash 進程替換執行的,以防止由標准管道創建的子外殼出現范圍問題(更多細節可以在BashFAQ/020 中找到,我針對這個問題進行了改編)。
在循環內部,我們有實際的重命名操作,它使用命令替換在文件上運行md5sum
,然后用awk
清理它(它被告知只打印第一個字段,即校驗和)。 目錄結構由參數擴展保留,其中${file%/*}
去除最后一個斜杠和所有尾隨的非斜杠字符,以便我們可以將哈希和.jpg
附加到新文件名。 (這與$(dirname "$file")
但沒有系統調用。)
如果您真的想要隨機數並且不關心沖突,請將$( md5sum "$file" |awk '{print $1}' )
替換$RANDOM
。 如果你給mv
一個-i
選項,它會在同一目錄中發生沖突時提示你。
由於read
和進程替換中的非標准標志,這在 POSIX shell 或其他基本 shell 中不起作用。 您可能可以使用mkfifo
和/或xargs -0
來解決這個問題,但這並不容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.