Linuxでファイル名に基づいて複数のディレクトリを作成し、ファイル名を変更する方法は?

Linuxでファイル名に基づいて複数のディレクトリを作成し、ファイル名を変更する方法は?

AllData次のファイルを含むディレクトリがあります。

AllData
 |____ file_1to1000.track
 |____ file_1001to2000.track
 |____ file_2001to3000.track

ファイル名に基づいてそのファイル名でディレクトリを作成しました。

for file in *; do dir=$(echo $file | cut -d. -f1); mkdir -p $dir; mv $file $dir; done

その中に別のディレクトリを作成してファイルをアーカイブしたいと思います。次のようにする必要があります。

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ file_1to1000.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ file_1001to2000.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ file_2001to3000.track

ファイルを上記のディレクトリに移動したら、ファイル名をからにfile_1to1000.track変更する必要がありますsoft.track。ディレクトリ内のすべてのファイルは元のファイル名からに変更する必要があります。soft.trackデフォルトでは、次のようになります。

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ soft.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ soft.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ soft.track

答え1

確認する:

for file in ./*; do
    echo mkdir -p "${file%.*}"/cuffcompare/ && \
    echo mv "$file" "$_"soft.track
done

ライナーで:

for file in ./*; do echo mkdir -p "${file%.*}"/cuffcompare/ && echo mv "$file" "$_"soft.track; done

注:echoテストの実行結果が満足のいくものであれば、上記の項目を削除してください。


${file%.*}ファイル名から一致する最短のサフィックスを削除します。だから.trackここではファイル名の終わりから切り取り始めます。みんな知ってるパラメータ拡張

$_前のコマンドの最後の引数を置き換えます(参照:シェル特殊パラメータ);次に拡張"${file%.*}"/cuffcompare/

したがって、見つかったファイルごとにmkdir次のディレクトリ(-pまたは存在しない場合は親ディレクトリを作成するために親ディレクトリが使用されます)構造が作成されます。

└── file_2001to3000
    └── cuffcompare

次に、mvファイルを次のsoft.tarck名前の関連ディレクトリに移動し、名前を変更します。

└── file_2001to3000
    └── cuffcompare
        └── soft.track

関連情報