Bashスクリプトを使用して既存のファイルからファイルを作成する

Bashスクリプトを使用して既存のファイルからファイルを作成する

次のような不明な名前のファイルを含むディレクトリがあります。

apple_2020-01-01.txt
apple_2020-01-02.txt
orange_2020-01-01.txt
pear_2020-01-02.txt
pear_2020-01-03.txt
pear_2020-01-04.txt

bashスクリプトを使用して、ファイルのタイムスタンプに基づいて、独自のタイムスタンプごとに1つずつ新しいファイルを作成したいと思います。

いくつかの仮定をすることができます。

1) ファイル名は常に Fruit_*.txt 形式に従います。

2) ファイル名は apple, orange, pear で指定します。

3)タイムスタンプは常にYYYY-MM-DD形式です。

上記のサンプルファイルに基づいて、スクリプトから次のファイルを生成したいと思います。

NewFile_2020-01-01.txt
NewFile_2020-01-02.txt
NewFile_2020-01-03.txt
NewFile_2020-01-04.txt

この目標をどのように達成できますか?

答え1

#!/bin/bash
shopt -s nullglob
for file in {apple,pear,orange}_*.txt; do
    touch "NewFile_${file##*_}";
done

各ファイルのアンダースコア文字までの先頭を削除し、タイムスタンプと拡張子のみを残してNewFile_結果に追加します。

touch既に存在するファイルを作成しようとしても文句はありません。

このソリューションは、下線の後にスペースがある場合にも機能します。

答え2

#!/bin/bash
printf '%s\n' {apple,orange,pear}_*.txt | 
     sed 's/apple\|orange\|pear/NewFile' |
     sort -u |
     xargs touch

シェルglobを使用してファイル名を取得し(それ以外の場合は失敗し、問題を引き起こす可能性がある数万)、sedを使用して名前を変更し、sort -uを使用して重複エントリを削除します。

最後に、xargs touchにフィードしてOPの明確な説明に基づいてファイルを作成します。

答え3

ls *.txt | cut -f2- -d_ | sort -u | xargs -IX touch NewFile_X

  • cut区切り文字が次のような2番目の「フィールド」が与えられた場合_

  • sort欺くアイテムの並べ替えと削除( unique )

  • xargsコマンドを実行して他のコマンドのコマンドにtouch置き換えるX

関連情報