我想改成小寫的文件名使用awk /桑達/ bash的,以大寫改小寫文件名使用awk,sed的或bash爲大寫
你的幫助,將不勝感激
aaaa.txt
vvjv.txt
acfg.txt
所需的輸出
AAAA.txt
VVJV.txt
ACFG.txt
我想改成小寫的文件名使用awk /桑達/ bash的,以大寫改小寫文件名使用awk,sed的或bash爲大寫
你的幫助,將不勝感激
aaaa.txt
vvjv.txt
acfg.txt
所需的輸出
AAAA.txt
VVJV.txt
ACFG.txt
前言:
如果你不關心你的擴展的情況下,只需使用「TR」工具在shell循環:
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
如果你關心的延伸的話,那麼你應該知道,有多種方法可以做到這一點(TIMTOWTDI)。就我個人而言,我相信這裏列出的Perl解決方案可能是Linux下最簡單和最靈活的解決方案。如果您有多個文件擴展名,只需指定您希望保持不變的數字即可。解決方案也是一個很好的解決方案,但是您必須願意多次寫出擴展,或者使用其他變量來存儲它。但是如果你需要認真的可移植性,那麼我建議在這個答案中使用八進制的最後一個解決方案。某些Linux版本還附帶一個名爲的工具,它可以重命名爲,這也值得一試。它的使用將從發行版到發行版有所不同,因此請輸入man rename
瞭解更多信息。
的解決方案:
使用Perl:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
使用BASH4:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
使用GNU awk:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
使用GNU sed:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
使用BASH3.2:
for i in *.txt; do
stem="${i%.txt}";
for ((j=0; j<"${#stem}"; j++)); do
chr="${stem:$j:1}"
if [[ "$chr" == [a-z] ]]; then
chr=$(printf "%o" "'$chr")
chr=$((chr - 40))
chr=$(printf '\'"$chr")
fi
out+="$chr"
done
mv "$i" "$out.txt"
out=
done
n.b. sed解決方案不兼容Mac/Darwin/BSD(非Linux?)* sed * – Orwellophile
@Orwellophile:GNU sed不是BSD sed。 BSD是Linux,就像GNU是Linux一樣。 – Steve
它也不適用於Solaris。 (這是SYSV)。但您的更正被記錄。它不適用於** sed **的非GNU版本** – Orwellophile
通常,對於小寫字母/大寫字母修飾,「tr」(翻譯字符)實用程序經常被使用,它來自用於字符替換的一組命令行實用程序。
dtpwmbp:~ pwadas$ echo "xxx" | tr '[a-z]' '[A-Z]'
XXX
dtpwmbp:~ pwadas$
此外,爲重命名文件有「重命名」實用程序,與perl(人重命名)交付。
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in
Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line,
filenames will be read via standard input.
For example, to rename all files matching "*.bak" to strip the extension, you might say
rename 's/\.bak$//' *.bak
To translate uppercase names to lower, you'd use
rename 'y/A-Z/a-z/' *
for f in *.txt; do
mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt"
done
這將大寫「txt」擴展名。另外,在bash中,使用here-string:'tr [:upper] [:lower:] <<<「$ f」' –
@glennjackman好點。 '$ {f%。*}'應該注意這一點。固定。 –
擊4參數擴展可以執行情況的變化:
for i in *.txt; do
i="${i%.txt}"
mv "$i.txt" "${i^^?}.txt"
done
慶典:
for f in *.txt; do
no_ext=${f%.txt}
mv "$f" "${no_ext^^}.txt"
done
這可能爲你工作(GNU SED):
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /' | sh
或者更簡單地說:
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /e'
我會建議使用rename
,如果你只是想爲大寫的文件名,而不是擴展,使用這樣的:
rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
\U
轉換爲大寫的一切,直到\E
,看perlreref(1)。當你對輸出滿意時,移除-n
。
您可能會添加^和$錨,並明確要求'。',所以匹配不依賴於正則表達式部分是貪婪還是懶惰;只是使它更可讀恕我直言。 –
這與OP想要的更適合。我已經添加了你的建議 – Thor
一個更簡單,輕巧便攜的做法是:
for i in *.txt
do
fname=$(echo $i | cut -d"." -f1 | tr [a-z] [A-Z])
ext=$(echo $i | cut -d"." -f2)
mv $i $fname.$ext
done
,因爲我們使用的是最常見的外部工具(切,TR)發現在每一個Unix版本這將BASH的幾乎每一個版本上工作。
(對終端),只需使用:
for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done;
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done;
這對我的作品。
1.我使用這些提示來改變我的有趣的文件名與bash單行:爲我在./*.*;做mv「$ i」「$(echo」$ i「| tr'[:?=&&'''[_]')」;完成; 2.跨引用fyi處理甚至奇怪的unicode字符:http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile