簡體   English   中英

如何在linux中重命名包含破折號的所有子目錄中的所有.jpg文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM