Bash

根據部分目錄名稱重命名多個目錄中的文件

  • October 26, 2021

我在一個位置有許多目錄,其中包含各種副檔名的文件。目錄遵循標準約定,但其中的文件沒有。我試圖找到的解決方案是根據它們所在目錄的一部分重命名每個文件夾中的文件,以獲取我必須經過的文件夾列表。

例如:

目錄:001234@Redsox#17

file1.pdf
file7A.doc
spreadsheet.xls

輸出:

001234@file1.pdf
001234@file7A.doc
001234@spreadsheet.xls

遍歷每個目錄,僅重命名目錄名稱中的附加程式碼。我已經有一個基本框架來操作整個過程,但我不確定如何最好地獲取我需要的目錄部分

for directory in *; do 
   pushd "$directory"
   index=1
   for filename in *; do
       target_filename="${directory}$????${filename}"
       mv "$filename" "${target_filename}"
       ((index++))
  done
 popd
done

我會做這樣的事情:

# nullglob
#    If set, Bash allows filename patterns which match no files to
# expand to a null string, rather than themselves.
shopt -s nullglob

# instead of looping through the dirs, loop through the files
# add al the possible extensions in the list
$ for f in */*.{doc,pdf,xls,txt}; do 
 # get the file dirname
 d=$(dirname "$f")
                 # using parameter expansion get the part
                 # of the dirname you need
 echo mv -- "$f" "$d/${d%%@*}@$(basename "$f")"

 # when you are satisfied with the result, remove the `echo`
done
$ ls -1 001234@Redsox#17/
001234@file1.pdf
001234@file7A.doc
001234@spreadsheet.xls

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