パターンのあるファイルを別のフォルダにコピーする

パターンのあるファイルを別のフォルダにコピーする

ディレクトリには次のファイルがあります。

ルブロン_2018.txt ルブロン_2019.txt

melo_2018.log melo_2019_01.log

Wade_2018.bak Wade_2019_02.jpg

すべてのファイルには「_」区切り文字があり、プレフィックスに従ってファイルを別の新しいディレクトリにコピーしたいと思います。例えば

lebron_2018.txt lebron_2019.txt は \backup\lebron にコピーされます。

melo_2018.log melo_2019_01.log が \backup\melo にコピーされます。

wade_2018.bak wade_2019_02.jpg は \backup\wade にコピーされます。

cp lebron*.* \backup\lebron で実行できます。しかし、ファイル名を検索してファイル名に基づいてフォルダに自動的にコピーできますか?

答え1

@AdminBeeリンクされた投稿には良いアイデアがたくさんありますが、glob使用できるパターンごとにループを実行するだけで正しいと感じます。

空白がないと仮定します。

for f in $(ls *_*.txt | cut -d_ -f1 | uniq); do
    mkdir -p ./backup/$f;
    cp $f_*.txt ./backup/$f/;
done

答え2

*nixシステムの場合、スラッシュの向きが間違っています。ファイル名にスペースや奇妙な文字が含まれていない場合は正常に動作します。

for FILE in *_*.txt ; do
  DIR="/backup/${FILE//_*}"
  mkdir -p "${DIR}" || continue
  mv "${FILE}" "${DIR}"
done

bash変数拡張を使用してファイルから名前を削除してディレクトリを作成します。データの損失を防ぐためにディレクトリを作成できない項目をスキップして安全に保ちます。

関連情報