Shell-Script
將重命名路徑目錄指定的所有文件的腳本
我必須在 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...