我在多個目錄中有多個檔案,我必須將這些檔案從小寫重命名為大寫;檔案擴展名可能會有所不同,并且需要小寫(對于具有大寫擴展名的檔案也應該重命名)。
注意:我有rename來自util-linuxCentOS Linux7 的版本。
我試過這個:
find /mydir -depth | xargs -n 1 rename -v 's/(.*)\/([^\/]*)/$1\/\U$2/' {} \;
find /mydir -depth | xargs -n 1 rename -v 's/(.*)\/([^\/]*)/$2\/\L$2/' {} \;
但它不作業它沒有任何改變,我沒有輸出。
嘗試了另一種解決方案:
for SRC in `find my_root_dir -depth`
do
DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
if [ "${SRC}" != "${DST}" ]
then
[ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
fi
done
這個部分有效,但也將檔案擴展名轉換為大寫。
關于如何將擴展保留/轉換為小寫的任何建議?
謝謝!
uj5u.com熱心網友回復:
rename- 獨立解決方案(find與 一起使用mv)
您可以使用以下命令重命名目錄中的所有檔案:
for i in $( ls | grep [A-Z] ); do mv -i $i `echo $i | tr 'A-Z' 'a-z'`; done
第一部分 ( for i in $( ls | grep [A-Z] );) 查找所有大寫字符并執行,直到所有檔案都被“掃描”。
第二部分 (``) 將所有大寫字符轉換為小寫字符。
基于 Perl 的rename依賴解決方案
rename -f 'y/A-Z/a-z/' *
此命令將大寫字符更改為小寫字符。-f選項允許覆寫現有檔案,但這不是必需的。
uj5u.com熱心網友回復:
Perl 的可能解決方案rename:
find /mydir -depth -type f -exec rename -v 's/(.*\/)?([^.]*)/$1\U$2/' {}
問題中的命令有幾個問題。
您似乎混淆了find's -execaction 和xargs.
find /mydir -depth -type f -exec rename -v 'substitution_command' {} \;
find /mydir -depth -type f| xargs -n 1 rename -v 'substitution_command'
如果檔案名包含空格,xargs則版本會出現問題。
如果替換\;為 ,則將多個檔案名傳遞給rename.
替換命令僅受該rename命令的 Perl 版本支持。您可能必須安裝此版本。請參閱獲取 Perl 重命名實用程式而不是內置重命名
替換在我的測驗中不起作用。我成功使用
rename -v 's/(.*\/)?([^.]*)/$1\U$2/' file ...
第一組(.*\/)?可選地匹配帶有尾隨的字符序列/。這用于復制未更改的目錄。
第二組([^.]*)匹配除 之外的字符序列.。
這是第一個點(如果有)之前的檔案名部分,它將被轉換為大寫。如果檔案名有多個擴展名,則全部保持不變,例如
Path/To/Foo.Bar.Baz->Path/To/FOO.Bar.Baz
uj5u.com熱心網友回復:
建議一個技巧awk將生成所有必需的mv命令:
awk '{f=$0;split($NF,a,".");$NF=tolower(a[1])"."toupper(a[2]);print "mv "f" "$0}' FS=/ OFS=/ <<< $(find . -type f)
檢查結果,并mv一起運行所有命令:
bash <<< $(awk '{f=$0;split($NF,a,".");$NF=tolower(a[1])"."toupper(a[2]);print "mv "f" "$0}' FS=/ OFS=/ <<< $(find . -type f))
awk腳本script.awk解釋
BEGIN { # preprocessing configuration
FS="/"; # set awk field separtor to /
OFS="/"; # set awk output field separtor to /
}
{ # for each line in input list
filePath = $0; # save the whole filePath in variable
# fileName is contained in last field $NF
# split fileName by "." to head: splitedFileNameArr[1] and tail: splitedFileNameArr[2]
split($NF,splitedFileNameArr,".");
# recreate fileName from lowercase(head) "." uppercase(tail)
$NF = tolower(splitedFileNameArr[1]) "." toupper(splitedFileNameArr[2]);
# generate a "mv" command from original filePath and regenerated fileName
print "mv "filePath" "$0;
}
測驗:
mkdir {a1,B2}/{A1,b2} -p; touch {a1,B2}/{A1,b2}/{A,b}{b,C}.{c,D}{d,C}
find . -type f
./a1/A1/Ab.cC
./a1/A1/Ab.cd
./a1/A1/Ab.DC
./a1/A1/Ab.Dd
./B2/b2/AC.DC
./B2/b2/AC.Dd
.....
./B2/b2/bC.cd
./B2/b2/bC.DC
./B2/b2/bC.Dd
awk -f script.awk <<< $(find . -type f)
.....
mv ./a1/b2/Ab.cd ./a1/b2/ab.CD
mv ./a1/b2/Ab.DC ./a1/b2/ab.DC
mv ./a1/b2/Ab.Dd ./a1/b2/ab.DD
mv ./B2/A1/bC.Dd ./B2/A1/bc.DD
.....
mv ./B2/b2/bC.DC ./B2/b2/bc.DC
mv ./B2/b2/bC.Dd ./B2/b2/bc.DD
bash <<< $(awk -f script.awk <<< $(find . -type f))
find . -type f
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478552.html
