これとグーグルで苦労しても、私に有効なソリューションを提供していないようです。
というフォルダがあります...
file å?? name.txt
たとえば、問題を回避するために、名前を変更したいのですが、どのように解決するのに苦労しています。私は' '
を使用しようとしましたが、各特殊文字の前に\
を使用しようとしました。 'file \å\?\? name \(2008\).txt'
ですが、次のエラーが表示されます...
-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory
これは\
の不適切な使用ですか、または別のアプローチが必要ですか?
ありがとう
非ASCII文字は問題ではありません。シェルはå
を完全にうまく処理できます。問題は、ファイルの名前が実際にはå??
ではないことです。もしそうなら、rm 'å??'
またはrm å??
でさえ機能していました。
それはå??
であると仮定します。これはls
が示すものであり、合理的な仮定ですが、ls
はさまざまなものを?
として表示します。例えば:
$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"
$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
上記でわかるように、改行、タブ、キャリッジリターン、ベル、および垂直タブ(など)はすべて?
として表示されます。上記で作成されたファイル/ディレクトリのうち、実際に名前に?
があるのは最初のファイル/ディレクトリのみです。 ls -b
でこれを確認できます:
$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\r\r\ name.txt
そのため、ls -b
を実行して正しいファイル名を取得し、 ANSI C quoting を使用して名前を変更できます。
mv å$'\r'$'\r' newname
または、globを使用して、名前がfile å
(note:で始まるすべてのファイル/ディレクトリに一致させることができます。 1つ持っています):
mv "file å*" newname
または、名前に英数字以外の文字が含まれるすべてのファイル/ディレクトリの名前を変更します(繰り返しますが、このような場合が1つだけの場合にのみ役立ちます)。
shopt -s extglob ## turn on extended globbing
mv !(*([[:graph:]])) newname
奇妙な!(*([[:graph:]]))
には説明が必要です。 extglob
は拡張グロブを有効にし、!(foo)
を使用して「not foo」に一致させます。 [[:graph:]]
文字クラスは、すべての印刷可能文字(タブ、改行などではない)に一致します。したがって、否定一致!(*([[:graph:]]))
は、非印刷文字を持つすべてのファイル/ディレクトリ名に一致します。
このようなケースを複数処理する必要がある場合は、ループを使用します。何かのようなもの:
for dir in !(*([[:graph:]])); do
mv "$dir" "${dir//[^[:graph:]]/_}";
done
${dir//[^[:graph:]]/_}
は、すべての非印刷文字が_
に置き換えられたディレクトリ名です。このアプローチの問題は、同じ名前で終わる異なるソースディレクトリを持つことができることです(たとえば、foo\n
とfoo\t
は両方ともfoo_
になります)。それが問題である場合、同様にカウンターを使用して名前を変更するだけです:
a=0; for dir in !(*([[:graph:]])); do
((a++));
mv "$dir" "${dir//[^[:graph:]]/_}$a"
done
結果は次のようになります。
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt6
私が理解している限り、ターミナルを使用して英語以外の文字を含むファイルまたはフォルダーの名前を変更する必要があります。
これには、次を使用できます
mv x y
ここで、xは名前を変更するファイル/フォルダーの名前で、yは新しい名前です。
英語以外の文字やスペースがある場合は、' '
を使用してxとyの制限を指定する必要があります。以下に例を示します。
mv 'öld namé öf fileş' 'néw namé öf fileş'
あなたの質問を誤解した場合は私を修正してください。
あなたは明らかにエスケープと引用を試みましたが、迷惑なファイル名でワイルドカードを使用することもできます。
$ ls *name\ 2008\ .txt <==== make sure you only get the one file
$ mv *name\ 2008\ .txt my_new_name.txt
これでニーズが満たされない場合はお知らせください-非グロビングを使用する他のアプローチがあります。