web-dev-qa-db-ja.com

ディレクトリ内の特殊文字とスペースを含むすべてのファイルの名前を変更するにはどうすればよいですか?

名前に空白スペースと特殊文字($と@)が含まれている特定のディレクトリにあるすべてのファイルの名前を変更するにはどうすればよいですか?

次のように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]
$

コマンドは機能しますが、ファイル名に変更を加えたり、エラーを返したりすることはありません。どうすればこれを修正できますか?他の方法もありますか?

9
Ankit Vashistha

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

それだけです。スクリプトを実行すると、空白文字()または$または@を含むすべてのファイル名が、これらの文字の代わりに_に変更されます。

1
Ankit Vashistha

-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' *
9
fredtantini

あなたはこのように試すことができます:

for file in ./*Block*                                       
do echo mv "$file" "${file//[ ()@$]/_}"
done

結果に満足したら、echoの前のmvを削除して、実際にファイルの名前を変更します。

7
don_crissti

特殊文字とドイツ語の特殊文字を削除するハンサムなスクリプトを探し、有用な情報を削除しないようにそれらをユニバーサルな文字に置き換えます。スクリプトの最新バージョンを更新しました。

#!/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

その結果:

enter image description here

@don_crissti:Linuxでは、ファイル名を移動するときに特殊文字を処理する際に独自の問題があるため、infileでhokus-pokusを実行しています。

2

これはファイル名から特殊文字を取り除くだけです

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オプション。

1
eapo

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
0
Ouss

私はしばらくの間、この問題の解決策を探していました。新しいパッケージをインストールできない古いクローズドシステムで作業しています。 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
0
ScriptKitty37