次のディレクトリがあります
-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
$ifile
db${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
必要に応じてパターンを変更できます。ループで実際に使用される名前のすべてのコンポーネントが存在することを確認するために、少し複雑なパターンを使用しました。