ls出力では、一重引用符で示されるファイル名、またはファイル操作に一重引用符が必要なファイルを名前変更するスクリプトをサポートする必要があります。このスクリプトは、ディレクトリ内のすべてのファイル名を変更するために使用されます。スクリプトをテストするために、アメリカのキーボードで入力できる英数字ではなく、表示可能なすべての文字(「a / b」および「a'b」を除く)を使用して一連のテストファイルを作成しました。
touch 'a~b' 'a`b' 'a!b' 'a@b' 'a#b' 'a$b' 'a%b' 'a^b' 'a&b' 'a*b' 'a(b' 'a)b' 'a-b' 'a_b' 'a+b' 'a=b' 'a{b' 'a}b' 'a[b' 'a]b' 'a|b' 'a\b' 'a:b' 'a;b' 'a"b' 'a<b' 'a>b' 'a,b' 'a.b' 'a?b' 'a b'
今私のテストディレクトリには、次のものが含まれます。
psilo@deb:~/sh$ ls
'a$b' a#b 'a)b' a-b 'a<b' a@b 'a^b' 'a|b'
'a b' a%b 'a*b' a.b 'a=b' 'a[b' a_b a}b
'a!b' 'a&b' a+b a:b 'a>b' 'a\b' 'a`b' a~b
'a"b' 'a(b' a,b 'a;b' 'a?b' a]b a{b filenametweak.sh
また、個人的に好むのは、trを空白に変更することです。そして下線a。
私のスクリプトは次のとおりです
#!/bin/bash
for file in *; do echo mv "$file" `echo $file | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\077\100-\132\135\141-\173\175\176'` ; done
単一引用符の間に表示されるASCII 8進値以外のtrコマンド(-cおよび-dパラメーターを含む)を介して入力ストリームからすべての文字を削除しようとしています。これにより、「問題」ASCII文字が削除された出力が生成されます(上記のls出力のファイル名の周りに一重引用符が必要な文字)。
トリガーを引く前に出力をテストするために、スクリプトのmv "$file"の前にechoコマンドを含めました。
しかし、スクリプトがファイル名に「?」または、「*」文字が見つかると、不要な出力が生成されます。
psilo@deb:~/sh$ ./filenametweak.sh
mv a$b ab
mv a b a.b
mv a!b ab
mv a"b ab
mv a#b a#b
mv a%b a%b
mv a&b ab
mv a(b ab
mv a)b ab
mv a*b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a+b a+b
mv a,b a,b
mv a-b a-b
mv a.b a.b
mv a:b a:b
mv a;b ab
mv a<b ab
mv a=b ab
mv a>b ab
mv a?b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a@b a@b
mv a[b ab
mv a\b ab
mv a]b a]b
mv a^b ab
mv a_b a.b
mv a`b ab
mv a{b a{b
mv a|b ab
mv a}b a}b
mv a~b a~b
mv filenametweak.sh filenametweak.sh
ファイル名に*またはが含まれている場合の問題を解決するには? bashで私のmvの名前を変更する意図を達成する他のおよび/またはより良い方法はありますか?
答え1
私はついに他のプロジェクトで作業中にこのスクリプトに再びアクセスし、疑問符を含むファイル名の問題を解決しました。
以下は、ファイル操作に一重引用符または二重引用符を必要としない方法ですべてのファイルに名前を付けるように、現在の作業ディレクトリのすべてのファイル名を変更するスクリプトソリューションです。
#!/bin/bash
for file in *; do echo mv "$file" `echo "$file" | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\100-\132\141-\173\175\176'` ; done
上記のように、これはtr
aにスペース(8進数40)文字を追加し、.
aにアンダースコア(_
)を追加します.
。これはLinuxファイル名の個人的な好みです。必要に応じて調整してください。
私の目的は、tr -cd
ファイルを操作するためにファイル名を一重引用符または二重引用符で囲む必要があるすべての入力文字を削除することです。ここでの例外は、]
一重引用符や二重引用符を必要としない閉じ括弧/右角括弧(8進数135、)です。一貫性のために、右/右の角かっこを削除することにしました。興味深いことに、左/左角括弧(8進数133、[
)はファイル操作に一重引用符または二重引用符が必要なためです。
- 次のコマンドを使用してスクリプトをテストします。
~$ touch 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test' ~$ ls filenametweak.sh 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test'
- スクリプトを実行します。
- 結果:
~$ ls filenametweak.sh test~@#%-.+{}:,..test