
私はディレクトリ構造を持っていますadc/asd/abc.20150918_150635.gz
... adc/asd/abc.20150921_140748.gz
(.gz
ファイル名には生成タイムスタンプが含まれています)。たとえば、asdに似た他の多くのディレクトリがあります。adc/gmf/abc.20150918_010738.gz
、、adc/ret/abc.20150921_140748.gz
すべてタイムスタンプのあるファイルを含みます。
単一のコマンドを使用して、すべてのディレクトリ(たとえば、など)からasd
最新のgmf
変更されret
たファイルをコピーしたいと思います。 :).
試しましたが、cp "adc/*/abc.* ."
すべてのファイルがコピーされます。 (単一コマンドを使用して)最近変更されたファイルのみをコピーしたいと思います。誰が私を助けることができますか?
答え1
(.)
各ディレクトリの最新の一般ファイルを見つけるには、まずディレクトリを見つけてから、各(/)
ディレクトリで最新のファイルを見つける(mtimeまたは)2段階のアプローチが(om[1])
最も適しています。 ZShellの場合:
% typeset -a latest
% cd $TMPDIR
% mkdir latest
% cd latest/
% mkdir a b c
% touch {a,b,c}/blah; sleep 3; touch {a,b,c}/a\ newer\ file
% for d in *(/N); do latest+=( $d/*(.om[1]) ); done
% [[ $#latest -eq 0 ]] && print uh oh
% print -l $latest
a/a newer file
b/a newer file
c/a newer file
%
説明できない理由で、ZSHでそのオプションを有効にしない限り(すべてのファイルが見つかったと仮定すると)これcp $latest destdir
で十分です。SH_WORD_SPLIT
この場合、他のシェルと同様に、引用の問題に対処する必要があります。
答え2
cp $(ls -1t */*/* | head -n 1) destdir
これは、ファイルリスト全体が利用可能なパラメータリストスペースに収まると仮定します(そうしないと、「パラメータリストが長すぎます」というエラーが発生します)。
ls -1t
引数を修正時の順序(最新のエントリの最初にoption -t
)でソートし、1行に1つのファイルを表示します(-1
option)。head -n 1
最初の行だけが埋められます。
これはコマンドラインで置き換えられ、で終わりますcp newestfile destdir
。