ファイル名を動的にトリミングする

ファイル名を動的にトリミングする

Linux初心者が来ました。

最初のbashスクリプトを作成していて、csvファイル名を切り取り削除するコードを書いていますが、これは非常に静的で、切りたい文字を手動で計算する必要があります。ファイルのプレフィックスを動的に削除したいと思います。人々がプレフィックスを保持する例をたくさん見ましたが、実際には最後の7文字(またはそれ以上...ファイル拡張子を含む)を維持したいと思います。

例は次のとおりです。

# Sample of filenames in a folder
SOLO_PAL3.xyz.ino.IVC.csv   ->  renamed to   IVC.csv
SOLO_PAL3.xyz.ino.EVC.csv   ->  renamed to   EVC.csv
SOLO_PAL3.xyz.ino.VVC.csv   ->  renamed to   VVC.csv
SOLO_PAL3.xyz.ino.WVC.csv   ->  renamed to   WVC.csv

ファイル名の切り捨て - この機能が機能している間、cut -c19-は現在特定のファイル長の整数を手動で更新する必要があります。この例では、実行する前に変更を確認できるようにエコーを維持しました。

for file in ???*;      
    do echo mv $file `echo $file | cut -c19-`; 
    # Something equivalent to RIGHT($file,$file.length-($file.length)-7))?
done

よろしくお願いします!

答え1

あなたの問題は次のように非常に似ています。これ、私の答えは部分的にその質問に対する答えに基づいています。

for f in *.csv
do
  newf="${f%.csv}"
  newf="${newf##*.}"
  printf '%s.csv\n' "${newf}"
done

問題ドメインをすべてのファイルのセットとして定義したので、最後からファイルを削除して*.csvループを開始します。.csv次に、ランダムな文字列とドットが続く最長の接頭辞を削除します.。最後にprintf残ったデフォルトのファイル名と再添付.csv

コマンドを実行する実際のメカニズムは、mv読者に練習の問題として残します。

答え2

Perlrenameユーティリティを使用してください。

rename -n 's/^.*\.(.{3}\.csv)$/$1/' *.csv

これは-n練習の実行になるので、実際にファイル名を変更せずにその内容だけが表示されます。会議する。要件を満たしていることを確認して再実行してください-n(または詳細な出力を得るに-nはに置き換えてください-v)。

メモ:これは、同じ名前を持つ他のプログラムではなく、perl名前変更ユーティリティでのみ機能します(特にutil-linuxパッケージの名前変更ユーティリティは、機能とコマンドラインオプションがまったく異なる完全に異なるプログラムです)。

Perl renameを実行して確認できます-V。出力は次のようになります。

$ rename -V
/usr/bin/rename using File::Rename version 1.13, File::Rename::Options version 1.10

Perlの名前変更のための実行可能ファイルは時々prenameまたはfile-rename。上記のコマンドラインがインストールされている場合は、上記のコマンドラインを使用するように調整してください。

関連情報