古いハードドライブから整理しようとしている写真がたくさんあります。 ls -l
、これらすべてのファイルの作成日が2012年以前であることに気づきました。理想的には、これらを自動的にマウントするように設定されていない私のコンピューターの2番目のハードドライブに移動したいと思います。できれば、これをすべて、いくつかのコマンドがリンクされたバッチとして実行できます。これまでのところ、私はls -l | grep -i 2012
は、提供された日付で2012のファイルのみを出力しますls -l
。ここでの秘訣は、それらすべてのファイルを新しいディレクトリにcp
'することです。各ファイルをコピーする必要があるため、これで次にどこへ行くかわかりません。次のコマンドセットは何ですか?
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
古いディスクに新しいファイルがあり、無視したい場合は、次のようにします
これのサンプルコマンドは次のとおりです。これは、古いディスクのディレクトリ階層を新しいディスクで維持することを前提としています(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
多分この問題はあなたの問題と非常に同じだと思います、これをチェックすることもできます: サブディレクトリを作成し、日付でファイルを整理する
その問題の最初の答えに基づいて、この新しいスクリプトを作成します。
for x in *; do
d=$(date -r "$x" +%Y)
mkdir -p "/your/new/directory/$d"
mv -- "$x" "/your/new/directory/$d/"
done
このスクリプトを、古いディレクトリのcopy.sh
という名前のファイルに書き込みます。
/your/new/directory
を新しいディレクトリのパスに置き換えます
このファイルをchmod +x copy.sh
で実行可能にします
次に、このファイルを./copy.sh
で実行します
おそらく、バッチ操作にはバッチツールを使用する必要があります。これを行うと、通常、たとえば、コピーされたファイルごとに個別の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
ページを参照してください。