簡體   English   中英

通過腳本重命名文件

[英]Renaming Files Through Script

我有一些文件名不正確(擴展名末尾添加了兩次)。 我試圖編寫一個bash腳本,該腳本將掃描目錄並重命名它們,但是會引發以下錯誤:

無法將“ /var/random/file/file1.avi.mp4”移動到“ {/var/random/file/file1.avi.mp4%.avi.mp4}.mp4”:沒有這樣的文件或目錄

我只想適當地重命名文件擴展名,並且不確定該錯誤在哪里起作用。 例如,上述錯誤的文件擴展名應為.mp4。 以下是我的劇本,如果有人可以提供幫助,我將無所適從...

#/bin/sh
for file in $(find /var/random/ -type f -name "*.avi.mp4"); do
  mv "$file" "{$file%.avi.mp4}.mp4"
done

您的變量擴展中有一個錯字:

"{$file%.avi.mp4}.mp4"

本來應該:

"${file%.avi.mp4}.mp4"

但是,您可能想看看重renameperl-rename

perl-rename 's/[^.]+\.(?=[^.]+$)//' /var/random/*/*.avi.mp4

正則表達式將刪除文件名中倒數第二個擴展名:

/path/to/file/foo.bar.baz -> /path/to/file/foo.baz
find . -type f -name "*.avi.mp4" -print0 | while read -rd '' filename
do
if [ -e "${filename%.avi.mp4}.mp4" ]
then
  mv --backup "${filename}" "${filename%.avi.mp4}.mp4"
  #doing the backup only if the destination file exists to save space.
else
  mv "${filename}" "${filename%.avi.mp4}.mp4"
fi
done

這里發生了什么 :

  1. 我們find所有擴展名為.avi.mp4的文件。
  2. 由於該文件可以包含換行符,我們做文件名null進行終止print0該選項的find
  3. 此輸出通過管道傳遞到while循環中,在此我們可以解析文件。
  4. 設置分隔符-d中的選項read為null( '' )命令,我們分析每個空終止的文件名。
  5. 最后,我們使用參數擴展/替換來消除每個文件末尾的.avi.mp4 ,並在mv階段將.mp4附加到每個文件。 參見參考文獻1。

參考文獻:

  1. Shell參數擴展
  2. 手動移動
  3. 為什么用while代替for?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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