先頭にドットとスペースがあり、最後にドットが欠落しているjpgファイルを変更しようとしています(下の. Startjpg
図を参照)。Start.jpg
要点はファイルを非表示にしてsed
そのls -al
ファイルを一覧表示するため、ls -al
オンラインsed
で多くのドキュメントを読みましたが、常にこのエラーが発生します。
sed: -e expression #1, char 6: unknown command: `/'
頑張った
ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'
もっとあります。
また、filejpgをfile.jpgに変更する必要があります。
答え1
Perlrename
ツールrename
のprename
使用
rename -n 's/(?<!\.)jpg$/.jpg/' * # -n makes it show you what it'll do,
# but not actually do it. Remove the -n to
# actually rename
このパターンを分析してみましょう。jpg$
これは「jpg」で終わるという意味です。(?<!\.)
「 'jpg'の前に点がない」を意味します。これはあなたが愚かなことにfoo.jpg
なるのを防ぐでしょう。foo..jpg
*
通常のシェルワイルドカードにrename
名前を変更することを検討するファイルのリストを取得します。あなたは間違いなくこれを行うことができ、/path/to/dir/*
ファイル名のリストを渡し、find
他のものと組み合わせることができます。
最初からドットやスペースを削除するのも非常に簡単です。
rename -n 's/^[. ]+//' * # trying -n first is good practice
これにより、すべての先行点とスペースが削除されます。なります. . . foo
。foo
通常、*
シェル拡張は名前がドットで始まるファイル(隠しファイル)を生成しません。 1つのオプションはを使用することです.*
。これにより、2つの特殊アイテム.
(現在のディレクトリ)と..
(親ディレクトリ)も作成されます。この場合、害はありません。最初のコマンドはそれを無視します(で終わらないjpg
)。 2番目のコマンドは名前を変更しようとしますが、エラーが発生します。別のオプションは、次のものを見つけることです。
find -type f -exec rename -n 's/^[. ]+//' '{}' +
-type f
ファイルに制限されます。もちろん、findの他のオプションを使用することもできます。
答え2
sed
非常に便利で多様なツールにもかかわらず、正しく使用していません。テキストファイルの文字列を一致させて置換するのに最適です。ファイルシステムでファイル名を直接変更することはできません。
これはbashシングルライナーに適しています(シェルであると仮定)。. filejpg
などの名前を変更するには、file.jpg
次のコマンドを使用します。
find . -name '. *' -print0 | while read -d $'\0' file; do short_file=${file%jpg}.jpg; mv "$file" "${short_file:4}"; done
説明する
find
特定のファイル属性(この場合はファイル名)と一致するファイルパスを返すプログラム。現在のパスのサブディレクトリにどの.jpgファイルがあるかを知りたい場合は、次のことができますfind . -name "*.jpg"
。通常、これは各ファイルを新しい行に出力します。これ-print0
により、一致はヌル文字で区切られます。これにより、出力を次のコマンドに渡すときにスペースを含むファイル名を正しく処理できます。
この|
役割をコンジットと呼びます。これはシェルに左側のコマンドの出力を取得し、右側のコマンド(この場合はread
ループ内部コマンド)に入力として渡すように指示しますwhile
。
このread
コマンドは、出力を取得してfind
変数に割り当てるために使用されますfile
。通常、これはfile
各単語に一度に値を割り当てますが、割り当て-d $'\0'$
はヌル文字で区切られます(フラグをfind
使用してファイルを区切る-print0
方法と一致)。
while ループを使用すると、read
「file」に一致する各ファイル名の値が繰り返し割り当てられます。 whileループの標準bash構文の一部do
です。done
while <something is true>; do
<run some commands>
done
この場合、「一部のコマンドの実行」は最初にファイル名の拡張子を変更し、それを新しい変数に割り当てます。short_file=${file%jpg}.jpg
次にファイル名を変更し、変更されたファイル名の先頭から拡張子を削除します。 . filejpg
. file.jpg
mv
.
mv "$file" ${short_file:2}
答え3
他の答えの代わりにグラフィックツールを使用できます。GPの名前変更。文字の変更、ファイル名の切り捨てなどを行うことができます。利点は、名前を変更する前に新しいファイル名を解決できるプレビュー機能が組み込まれていることです。ただし、一度に1つのディレクトリでしか機能できないため、サブフォルダ内の複数のフォルダで使用するのは不便です。ただし、フォルダが10個未満の場合は問題ありません。