名前に空白スペースと特殊文字($と@)が含まれている特定のディレクトリにあるすべてのファイルの名前を変更するにはどうすればよいですか?
次のようにrename
コマンドを試して、すべてのスペースと特殊文字を_に置き換えました。
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$
コマンドは機能しますが、ファイル名に変更を加えたり、エラーを返したりすることはありません。どうすればこれを修正できますか?他の方法もありますか?
rename
コマンドは不明な理由で機能せず、質問に対して他の回答が得られなかったため、名前変更を可能にするために努力しました。これはファイルの名前を変更するための最良のアプローチではないかもしれませんが、私にとってはうまくいきました。これが答えとして投稿したいので、他の誰かが読んだ場合、これは私が行った方法でファイル名を変更するのに役立つでしょう。
今、私は、すべてのファイルの名前に「ブロック」という特定のテキストが含まれていることを知っています。以下は、名前変更が行われる前のファイル名です。
anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:48 Bharti TRX Block [email protected]
これを可能にする小さなシェルスクリプトを作成しました。コードは次のとおりです。
#!/bin/bash
PATH="/home/ebfijjk/anks"
# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues
# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues
# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew
# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
mv "$oldValue" "$newValue"
done < oldAndNew
rm oldValues newValues oldandNew
それだけです。スクリプトを実行すると、空白文字()または$
または@
を含むすべてのファイル名が、これらの文字の代わりに_
に変更されます。
-n
フラグは
-何もしない
アクションなし:名前が変更されるファイルを表示します。
したがって、変更がない場合は正常です。
あなたのコマンドに関しては、それは私のために働いています:
$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test
多分あなたのシェルに応じて、あなたはエスケープする必要があります|
$ rename -n 's/ \|\$\|@/_/g' *
または、[…]
文字をグループ化する表記:
$ rename -n 's/[ @\$]/_/g' *
あなたはこのように試すことができます:
for file in ./*Block*
do echo mv "$file" "${file//[ ()@$]/_}"
done
結果に満足したら、echo
の前のmv
を削除して、実際にファイルの名前を変更します。
特殊文字とドイツ語の特殊文字を削除するハンサムなスクリプトを探し、有用な情報を削除しないようにそれらをユニバーサルな文字に置き換えます。スクリプトの最新バージョンを更新しました。
#!/bin/bash
for file in ./*
do
infile=`echo "${file:2}"|sed \
-e 's|"\"|"\\"|g' \
-e 's| |\ |g' -e 's|!|\!|g' \
-e 's|@|\@|g' -e 's|*|\*|g' \
-e 's|&|\&|g' -e 's|]|\]|g' \
-e 's|}|\}|g' -e 's|"|\"|g' \
-e 's|,|\,|g' -e 's|?|\?|g' \
-e 's|=|\=|g' `
outfileNOSPECIALS=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
outfileNOoe=`echo $outfileNOSPECIALS| sed -e 's|ö|oe|g'`
outfileNOae=`echo $outfileNOoe| sed -e 's|ä|ae|g'`
outfileNOue=`echo $outfileNOae| sed -e 's|ü|ue|g'`
outfileNOOE=`echo $outfileNOue| sed -e 's|Ö|OE|g'`
outfileNOAE=`echo $outfileNOOE| sed -e 's|Ä|AE|g'`
outfileNOUE=`echo $outfileNOAE| sed -e 's|Ü|UE|g'`
outfileNOss=`echo $outfileNOUE| sed -e 's|ß|ss|g'`
outfile=${outfileNOss}
if [ "$infile" != "${outfile}" ]
then
echo "filename changed for " $infile " in " $outfile
mv "$infile" ${outfile}
fi
done
exit
その結果:
@don_crissti:Linuxでは、ファイル名を移動するときに特殊文字を処理する際に独自の問題があるため、infileでhokus-pokusを実行しています。
これはファイル名から特殊文字を取り除くだけです
for file in *; do mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done
ॐNámásté Egész-ség.mkv --> NmstEgsz-sg.mkv
; do
の後にecho
を入れて、前にテストします。
for file in *; do echo mv "$file" `echo $file | tr -cd '.A-Za-z0-9_-'` ; done
別の解決策:
rename -v 's/[^a-zA-Z0-9\.\s_-]//g' *.* && rename -v 's/[\s]/_/g' *.*
ॐNámásté Egész-ség.mkv --> Nmst_Egsz-sg.mkv
以前にテストする-n
オプション。
Ubuntu 18.04 LTSでbash 4.4.20(1)-releaseを使用している私にとって、このワンライナーはスペース、@ 、:#...を削除するのにうまくいきました.
テストするには(echo
コマンドに注意してください:
for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; done
実行するには:
for file in ./* ; do if [[ $file == *['!'\ :@#]* ]]; then echo mv "$file" "${file//[ #()@$:]/_}"; fi; done
私はしばらくの間、この問題の解決策を探していました。新しいパッケージをインストールできない古いクローズドシステムで作業しています。 rename
コマンドがありません。最後に、キーボードで入力されたすべての特殊文字で動作するように見えるスクリプトを書きました。 ~@#$%^&*()-_=+[]{}\|;:",<.>?'
スクリプトは、現在のディレクトリ内のすべてのファイルとディレクトリの名前を変更します。 -_.
を除くすべての特殊文字を_
文字に置き換えます。 outfile=
行は、必要に応じて置換用に別の文字を使用するように変更できます。たとえば、|_|
を|.|
に置き換えて、.
文字を使用します。
#!/bin/bash
for file in ./*
do
infile=`echo "${file:2}"|sed \
-e 's|"\"|"\\"|g' \
-e 's| |\ |g' -e 's|!|\!|g' \
-e 's|@|\@|g' -e 's|*|\*|g' \
-e 's|&|\&|g' -e 's|]|\]|g' \
-e 's|}|\}|g' -e 's|"|\"|g' \
-e 's|,|\,|g' -e 's|?|\?|g' \
-e 's|=|\=|g' `
outfile=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
mv "$infile" ${outfile} &
done
exit