ファイル名の先頭からドットとスペースを削除する方法

ファイル名の先頭からドットとスペースを削除する方法

先頭にドットとスペースがあり、最後にドットが欠落している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ツールrenameprename使用

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

これにより、すべての先行点とスペースが削除されます。なります. . . foofoo

通常、*シェル拡張は名前がドットで始まるファイル(隠しファイル)を生成しません。 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.jpgmv.mv "$file" ${short_file:2}

答え3

他の答えの代わりにグラフィックツールを使用できます。GPの名前変更。文字の変更、ファイル名の切り捨てなどを行うことができます。利点は、名前を変更する前に新しいファイル名を解決できるプレビュー機能が組み込まれていることです。ただし、一度に1つのディレクトリでしか機能できないため、サブフォルダ内の複数のフォルダで使用するのは不便です。ただし、フォルダが10個未満の場合は問題ありません。

関連情報