web-dev-qa-db-ja.com

特殊文字を使用してファイルとフォルダーの名前を変更する

これとグーグルで苦労しても、私に有効なソリューションを提供していないようです。

というフォルダがあります...

file å?? name.txt

たとえば、問題を回避するために、名前を変更したいのですが、どのように解決するのに苦労しています。私は' 'を使用しようとしましたが、各特殊文字の前に\を使用しようとしました。 'file \å\?\? name \(2008\).txt'ですが、次のエラーが表示されます...

-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory

これは\の不適切な使用ですか、または別のアプローチが必要ですか?

ありがとう

3
spcurtis81

非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\nfoo\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
5
terdon

私が理解している限り、ターミナルを使用して英語以外の文字を含むファイルまたはフォルダーの名前を変更する必要があります。

これには、次を使用できます

mv x y

ここで、xは名前を変更するファイル/フォルダーの名前で、yは新しい名前です。

英語以外の文字やスペースがある場合は、' 'を使用してxとyの制限を指定する必要があります。以下に例を示します。

mv 'öld namé öf fileş' 'néw namé öf fileş'

あなたの質問を誤解した場合は私を修正してください。

0
SarpSTA

あなたは明らかにエスケープと引用を試みましたが、迷惑なファイル名でワイルドカードを使用することもできます。

$ ls *name\ 2008\ .txt    <==== make sure you only get the one file

$ mv *name\ 2008\ .txt  my_new_name.txt

これでニーズが満たされない場合はお知らせください-非グロビングを使用する他のアプローチがあります。

0
uDude