Shell-Script

將重命名路徑目錄指定的所有文件的腳本

  • February 6, 2022

我必須在 Ubuntu 上編寫一個腳本,它將路徑目錄指定的所有文件重命名為大寫。我已經找到了一個可以重命名文件的循環,但我不確定如何將路徑傳遞給這個循環。你能幫助我嗎?

這是循環:

for f in *; do 
   mv "$f" "$f.tmp"; 
   mv "$f.tmp" "`echo $f | tr "[:lower:]" "[:upper:]"`"; 
done

我試圖通過這樣的路徑

for f in path_to_dir* ...

但它做了什麼,它只是以某種方式製作了一個目錄 .tmp

我懷疑你做了類似的事情,for f in /path/to/dir*而不是/path/to/dir/*. 前者將查找/path/to名稱以開頭的文件和目錄,dir而後者將遍歷目錄的內容。

無論如何,這對你沒有幫助,因為tr你使用的命令會改變一切,包括/path/to/dir大寫,讓你留下/PATH/TO/DIR不存在的東西。好消息是你可以用一種更簡單的方式來做到這一點。

如果您使用的是 bash,則可以使用${var^^}將變數的內容設為大寫。所以你可以這樣做:

for f in /path/to/dir/*; do
   ## get the file's name
   name=$(basename -- "$f")
   ## make the new name
   mv -- "$f" /path/to/dir/"${name^^}"
done

或者,為了避免兩次輸入目錄名稱,您可以將其保存在變數中:

targetPath="/path/to/dir"
for f in "$targetPath"/*; do
   ## get the file's name
   name=$(basename -- "$f")
   ## make the new name
   mv -- "$f" "$targetPath"/"${name^^}"
done    

但是,這是cd進入目標目錄並在那里工作更簡單和更清晰的情況之一:

targetPath="/path/to/dir"
cd -- "$targetPath" && 
for f in *; do
   mv -- "$f" "${f^^}"
done

或者,為避免進入新目錄,請在子 shell 中執行循環:

targetPath="/path/to/dir"
( cd -- "$targetPath" && 
for f in *; do
   mv -- "$f" "${f^^}"
done
)

最後,您還可以使用perl-rename(在 Ubuntu 上稱為rename並且可使用 安裝sudo apt install rename)來完成所有這些操作:

rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*

-n製造商只是列印出rename它不做它會做什麼。如果您對它的工作感到滿意,請再次執行它而不-n實際重命名文件。

我會做類似的事情:

#! /bin/zsh -
ret=0
autoload zmv
for dir do
 (cd -P -- "$dir" && zmv '*(#qN)' '$f:u') || ret=$?
done
exit "$ret"

該腳本被稱為:

that-script /path/to/dir /path/to/other/dir...

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