./date-and-time/fixed/path/filename
にファイルのコレクションがあり、date-and-time
とfilename
は可変です。これらすべてのファイルを./filename/date-and-time
に移動したいと思います。前のパスはファイル名で、前のファイル名はパスです。これを行う良い方法はありますか?合計で〜1000個のファイルがあり、〜100個の異なるファイル名があります。
このような何かが動作するはずです(実際のコマンドをecho
edしていることに注意してください;それらを削除する前にそれが正しいことをしていることを注意深く確認してください)
#!/bin/bash
shopt -s nullglob
for file in */fixed/path/*; do
[[ -f "$file" ]] || continue
f="${file##*/}"; d="${file%%/*}"
echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done
パスのパターンは常に./date-and-time/fixed/path/filename
で、変数date-and-time
とfilename
であると仮定します。
date-and-time
はawk
で抽出できます:
$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print $2}'
date-and-time
filename
はbasename
で抽出できるため、取得が少し簡単です。
$ basename ./date-and-time/fixed/path/filename
filename
これらの2つのコードセグメントから、.
で実行されたときに記述した方法でファイルを移動するためのテストされていないスクリプトが続きます。使用前に確認してください。
#!/bin/bash
for i in ./*/fixed/path/*; do
date_and_time=$(echo "$i" |awk -F "/" '{print $2}');
filename=$(basename "$i");
mkdir "$filename";
mv "$i" "$filename"/"$date_and_time";
done;
このような :
mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time
さらにフォルダを作成する必要がある場合は、次のようなスクリプトを作成することをお勧めします。
開始する前に、これを実行しようとしているフォルダーのバックアップを作成することをお勧めします。
操作しようとしているフォルダーにcdしてから、次の操作を行います。
for file in *; do
if [[ -f "$file" ]]; then
mkdir "${file%.*}"
mv "$file" "${file%.*}"
fi
done