特定の日付に異なるLinuxシステムのファイルのリストがあるため、一意のファイルを検索して別のディレクトリに配置する必要があります。ここで、「固有」は2番目のファイル名までを意味するので、_
以下の例では100001_ABC
。100001_XYZ
100001_ABC_25Sep2020_1200-25Sep2020_1300.csv
100001_XYZ_30Sep2020_1300-30Sep2020_1400.csv
100001_XYZ_30Sep2020_1400-30Sep2020_1500.csv
このディレクトリに一意の名前のファイルを配置したいと思います。
/home/vikrant_singh_rana/uniquefiles/
スクリプトは次のファイルのみコピーする必要があります。
100001_ABC_25Sep2020_1200-25Sep2020_1300.csv
100001_XYZ_30Sep2020_1300-30Sep2020_1400.csv
これは私のシェルスクリプトです
#!/bin/bash
set +o posix
#reading file names into file_array
readarray -t file_array < <(
cd "/home/vikrant_singh_rana/unzipfiles"
printf "%s\n" * | cut -d"_" -f2 | cut -d"-" -f1 | sort -u )
#print items of array
printf '%s\n' "${file_array[@]}"
for i in "${file_array[@]}"; do
#echo $i
find /home/vikrant_singh_rana/unzipfiles/ -type f -name "*$i*.csv" -exec awk '!seen[$0]++' {} +
done
スクリプトは識別名を正しく見つけましたが、それを別のディレクトリに移動する方法が見つかりませんでした。
ベストアンサー1
そしてzsh
。
typeset -A files
for f (*_*_*.csv(.On)) files[${(M)f#*_*_}]=$f
mv -- $files target-directory/
glob.
修飾子は次のように制限されます。定期的なファイルをOn
逆順に並べ替えることで、最後の連想配列に与えられたキーのアルファベット順に最初のファイル(ここでは2番目のファイルまでの部分)が含まれます_
。
おそらく語彙の順序ではなく、修正時間に基づいてo
ソートしたいと思うでしょうm
(100001_XYZ_01Oct2020_0000-01Oct2020_0100
これが起こった場合)今後 100001_XYZ_30Sep2020_2200-30Sep2020_2300
たとえば、語彙的に)、最初のファイルの代わりに最も古いファイルを語彙的に移動するように置き換えますOn
(最新のファイルから最も古いファイルの順にソート)。om
あるいは、ファイル名の最初のタイムスタンプに基づいてソート順を定義することもできます。
zmodload zsh/datetime
bydate() strftime -rs REPLY %d%b%Y_%H%M ${${REPLY%-*}#*_*_}
/nO+bydate
代わりに使用してください。On
om
GNUツールを使用すると、bash
次のようなことができます(これに限定されません)。定期的なファイルですが、修正時間でソートされません):
shopt -s failglob
printf '%s\0' *_*_*.csv | sort -zsmut_ -k1,2 | xargs -r0 mv -t target-dir --
(すべて-z
、、、、-s
はGNU拡張です。-r
)-0
-t
ファイル名から抽出されたタイムスタンプに基づいてソートする方法は次のとおりです。
printf '%s\0' *_*_*.csv |
# key year month day HHMM
LC_ALL=C sort -zt_ -k1,2 -k3.6,3.9n -k3.3,3.5M -k3.1,3.2n -k3.11,3.14n |
LC_ALL=C sort -zsmut_ -k1,2 |
xargs -r0 mv -t target-dir
もし、もし鍵の場合、最初と2番目の項目の間の部分を(または)またはに置き換える必要が_
あります。${(M)f#*_*_}
${${f#*_}%%_*}
${${(s[_])f}[2]}
-k1,2
-k2,2