web-dev-qa-db-ja.com

CLIを使用して日付でファイルを別のディレクトリに移動する

古いハードドライブから整理しようとしている写真がたくさんあります。 ls -l、これらすべてのファイルの作成日が2012年以前であることに気づきました。理想的には、これらを自動的にマウントするように設定されていない私のコンピューターの2番目のハードドライブに移動したいと思います。できれば、これをすべて、いくつかのコマンドがリンクされたバッチとして実行できます。これまでのところ、私はls -l | grep -i 2012は、提供された日付で2012のファイルのみを出力しますls -l。ここでの秘訣は、それらすべてのファイルを新しいディレクトリにcp 'することです。各ファイルをコピーする必要があるため、これで次にどこへ行くかわかりません。次のコマンドセットは何ですか?

9
nerdenator

lsは使用しないでください。このような場合に使用することはお勧めしません。さらに、grepを使用して日付でフィルタリングすることはお勧めできません。 2012年に変更されていなくても、ファイル名自体に2012文字列が含まれている可能性があります。

findコマンドを使用して、その出力をパイプします。

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

ここに、

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 
12
shivams

古いディスクに新しいファイルがあり、無視したい場合は、次のようにします

  1. 必要なファイルと不要なファイルを区別する、更新日を含む一時マーカーファイルを作成する
  2. マーカーファイルより古いファイルを新しい場所にコピーする

これのサンプルコマンドは次のとおりです。これは、古いディスクのディレクトリ階層を新しいディスクで維持することを前提としています(cpioは、tarまたはpaxと同様のコピーコマンドです。 ):

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk
4
roaima

多分この問題はあなたの問題と非常に同じだと思います、これをチェックすることもできます: サブディレクトリを作成し、日付でファイルを整理する

その問題の最初の答えに基づいて、この新しいスクリプトを作成します。

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. このスクリプトを、古いディレクトリのcopy.shという名前のファイルに書き込みます。

  2. /your/new/directoryを新しいディレクトリのパスに置き換えます

  3. このファイルをchmod +x copy.shで実行可能にします

  4. 次に、このファイルを./copy.shで実行します

2
warmblue

おそらく、バッチ操作にはバッチツールを使用する必要があります。これを行うと、通常、たとえば、コピーされたファイルごとに個別のcpプロセスを呼び出すのではなく、単一のストリームですべてのレコードを読み取り/書き込みします。

ここにはすでにcpioと書かれた回答があります。これは、すでに提供されているオプションのみを考えると、おそらく私が選択するものです。ただし、cpioフォーマットは、全盛期から改良され、標準化されたpaxアーカイブフォーマットに組み込まれました。 tarについても同様です。

厳密にはPOSIX -paxは、ファイルの変更時間に基づいてアーカイブメンバーを直接フィルタリングするためのオプションを提供しない可能性があります-標準では%Tリストモード形式修飾子が指定されています。それでも、私が知っている最も一般的に利用可能なpax実装-これは mirabilos によって維持されるBSDバージョンです-直接アクセス可能なCLIスイッチに拡張します。

たとえば、ccyymmddHHMMの前に最後に変更された、./をルートとするツリー内のすべてのファイルのみを/target/dirにコピーするには、次のようにします。

pax -rwT,201301010000 ./ /target/dir

子ディレクトリへの再帰を回避するには、代わりに次のようにします。

pax -rwdT,201301010000 ./* /target/dir

詳細は man ページを参照してください。

1
mikeserv