複数のファイルを複数のディレクトリに移動

複数のファイルを複数のディレクトリに移動

次のディレクトリがあります

-rw-r--r-- 1 ualaoip2 mcm1    1073233 Sep 30 12:40 database.260.4-0.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  502373963 Sep 30 12:40 database.260.4-1.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  880379753 Sep 30 12:40 database.260.4-2.tar.gz
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db0file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db1file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db2file

ファイルを&cdatabase...0に移動したいと思います。folder0

これを行う最良の方法は何ですか?様々なバリエーションを試しました

for i in $(ls fi*) do; mv $i ./folder$i

しかし、彼らはいくつかのアイテムの名前を変更し、私が望んでいない多くのアイテムを上書きしました!

私が使ったバリエーション

find . -maxdepth 1 -type d -printf '%f\n' | sort /* why is it not sorted?

しかし、現在のディレクトリに 。

mkdir db{0..7} を使用してファイルを生成します。これが最善の方法ですか?

私はその答えをいくつかの言葉で説明できたらと思います。猿が見るだけでなく、猿がするのも言葉だ! :-)

答え1

ファイル名形式が利用可能な場合は、次のコマンドを使用できます。

for i in $(seq 0 2); do mv database*-"$i".tar.gz "db${i}file"/; done

指示があります。あなたのファイルは安定した形式で表示され、database*-NUMBER.tar.gzディレクトリ名に同じ番号がありますdbNUMBERfile。私たちは最高の数(この場合は0..2)を生成し、この数に対してループを実行できます。データベースの場合は境界に$iあるため、単純で十分ですが、変数が定義されていないため機能しないため、以下を使用する必要があります。中かっこを使用すると、正しく解決できます。-.db$ifile$ifiledb${i}file$i

答え2

set -o nullglob

for name in database*-*[0-9].tar.gz; do
    num=${name##*-}
    num=${num%%.*}

    [ ! -d "folder$num" ] && mkdir "folder$num"

    mv "$name" "folder$num"
done

database*-*[0-9].tar.gzパターンに一致するすべてのファイル名を繰り返します。

変数numはファイル名の末尾にある数字(数字は2桁以上にすることができます)になり、最初に名前から最後の数字まですべてを削除し、次にドットとすべてを削除して-ファイル名から選択します。

ターゲットフォルダがまだ存在しない場合は作成されます。

nullglobシェルオプションを first に設定すると、bashパターンがファイル名と一致しない場合、ループはまったく入力されません。


database*.tar.gz必要に応じてパターンを変更できます。ループで実際に使用される名前のすべてのコンポーネントが存在することを確認するために、少し複雑なパターンを使用しました。

関連情報