パターンに応じて一意のファイルを選択して移動します。

パターンに応じて一意のファイルを選択して移動します。

特定の日付に異なるLinuxシステムのファイルのリストがあるため、一意のファイルを検索して別のディレクトリに配置する必要があります。ここで、「固有」は2番目のファイル名までを意味するので、_以下の例では100001_ABC100001_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ソートしたいと思うでしょうm100001_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代わりに使用してください。Onom

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

おすすめ記事