同じ区切り文字を使用して複数のインスタンスのディレクトリ名を切り取る(シェル)

同じ区切り文字を使用して複数のインスタンスのディレクトリ名を切り取る(シェル)

名前を変更したいディレクトリがあります。たとえば、次のようになります。10-00017_S9_L001_plasmidspades_careful

10-00017_S9_L001セクション名を変更したい。

cutコマンドを使用してみましたecho "$filename" | cut -d'_' -f3が、ファイル名のL001部分のみが残りました。

明らかに手動で名前を変更できますが、何百ものディレクトリがあり、時間がありません。

cutコマンドを使用して区切り文字の特定のインスタンスの前のすべての項目を取得する方法はありますか?それとも実際に使用できる他の項目はありますか?

答え1

最善の解決策は、rename(Debian)またはprename(RedHat)(同じコマンド、別の名前)を使用することです(これらのパッケージは標準のデプロイリポジトリから追加する必要があるかもしれません)。正規表現(Perlスタイル)を使用してください。たとえば、競争に厳しくなるように努力してみてください。

rename -n 's/(\d+_\d+_S\d_L\d+)_.+/$1/' *

またはより緩く:

rename -n 's/(.+_.+_.+_.+)_.+/$1/' *

実際の実行のために-n何をするか、削除(またはで置き換える方が良い)を示します。-v

bashがバックスラッシュとドルを変更しないようにするには、パターンの周りに一重引用符を記録します。

答え2

かなり低レベルの技術ソリューション:

  • ファイル内のディレクトリリストを使用lsまたは作成します。find
  • おなじみのエディタを使用して各行を置き換えます(のみoldnamemv oldname newname
  • スクリプトを実行します。

    . list_of_moves
    

    (先行ポイント間隔に注意してください)

答え3

すべてのディレクトリをファイルに入れ、次のコマンドを実行して名前を変更します。

awk '{print "mv"  " "   $1  " " substr($1,1,16)}' filename | sh

上記のDirtectoyをテストしましたが、うまくいきます。

echo "10-00017_S9_L001_plasmidspades_careful" | awk '{print "mv"  " "   $1  " " substr($1,1,16)}' | sh

関連情報