次のような不明な名前のファイルを含むディレクトリがあります。
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
欺くアイテムの並べ替えと削除(u
nique )xargs
コマンドを実行して他のコマンドのコマンドにtouch
置き換えるX