ディレクトリに1000個のファイルがあり、ファイル名に基づいてサブディレクトリにソートしたいと思います。これらはすべて集合構造p-[番号]_n-[番号]_a-[番号].[ext]に沿って一貫して名前が付けられます。
これは小さなサンプルです...
- p-12345_n-987_a-1254.jpg
- p-12345_n-987_a-9856.pdf
- p-12345_n-987_a-926.docx
- p-12345_n-384_a-583.pdf
- p-12345_n-384_a-987.pdf
- p-2089_n-2983_a-2348.gif
- p-2089_n-1982_a-403.jpeg
- p-38422_n-2311_a-126.pdf
- p-38422_n-2311_a-5231.docx
私が望むのは、次のフォルダ構造です。
p-12345
⊢ n-987
⊢ p-12345_n-987_a-1254.jpg
⊢ p-12345_n-987_a-9856.pdf
⊢ p-12345_n-987_a-926.docx
⊢ n-384
⊢ p-12345_n-384_a-583.pdf
⊢ p-12345_n-384_a-987.pdf
p-2089
⊢ n-2983
⊢ p-2089_n-2983_a-2348.gif
⊢ n-1982
⊢ p-2089_n-1982_a-403.jpeg
p-38422
⊢ n-2311
⊢ p-38422_n-2311_a-126.pdf
⊢ p-38422_n-2311_a-5231.docx
これが意味があることを願っています。
このようにファイルを構成するスクリプトを作成できますか?
編集:明確にするために:はい、私の質問は次のようになります。どのようにファイルをクリーンアップするスクリプトを書くことはできますか? :) 私はUnixとコマンドラインに初めて触れました。これまでは、デフォルトのシェルスクリプトのみを作成/使用していました。答えには正規表現を含めることができるようですが、それ以外はどこから始めるべきかわかりません。
私が思いついた最高のアイデアは
- ファイルリストをテキストファイルにエクスポート
- 「_n」と「_a」を検索し、「/n」と「/a」に置き換えます。
- 次に、一連のmvコマンドを作成します。
- シェルスクリプトとして保存
私はこれが必要なものよりはるかに冗長であると確信しています。また、後でより多くのファイルを使用してこれを行う必要がある場合に備えて、再現可能なものが欲しいと思います。
ベストアンサー1
確かに:
#!/bin/bash
for i in p-*_n-*.*; do
Ppart=${i/_n-*}
x=${i/${Ppart}_/}
nPart=${x/_a-*}
mkdir -p $Ppart/$nPart
mv $i $Ppart/$nPart
done
指定したパターンに一致するすべてのファイル名を繰り返し始めます。各ループのシェル置換を使用して、_n-
P部分(最初のレベルディレクトリ)を提供する部分で始まるファイル名の最後の部分を削除します。今、部品n-
から始めてN個の部品が必要です_a-
。これは2段階で行われる。まず、Ppartを削除してから、_a-
その部分から始まる最後の部分を削除します。
これでmkdir -p
、必要なディレクトリを作成するために使用されます。mkdir -p
パスがすでに存在する場合、エラーは発生しないため、mkdir -p
コマンドの実行を決定する前にディレクトリが存在するかどうかをテストするのではなく、単に実行する方が簡単です。
最後に、ファイルを正しいディレクトリに移動します。