古いハードドライブの写真をたくさん集めて整理しようとしています。を実行すると、ls -l
これらすべてのファイルの作成日が2012年以前であることがわかります。理想的には、自動的にインストールするように設定されていないマイコンピュータの2番目のハードドライブに移動したいと思います。好ましくは、いくつかのコマンドを一緒に接続して一括で実行できます。これまで、私はls -l | grep -i 2012
提供された2012年の日付のファイルだけを吐き出しましたls -l
。今の秘密は、cp
これらすべてのファイルを新しいディレクトリに追加することです。すべてのファイルをコピーする必要があるので、次にどこに行くのかわかりません。次のコマンドセットは何ですか?
答え1
使用しないでください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
答え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
答え3
私の考えでは、この問題はあなたの問題と非常によく似ているかもしれません。以下を見ることもできます。サブディレクトリを作成し、日付別にファイルを整理します。
私はこの質問に対する最初の答えに基づいてこの新しいスクリプトを作成しました。
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
答え4
バッチジョブにはバッチツールを使用する必要があります。これを行うには、通常、コピーされたcp
各ファイルに対して別々のプロセスを呼び出すのではなく、単一ストリーム内のすべてのレコードを読み書きする必要があります。
ここに答えが書かれていますcpio
。おそらくあなたに提供されたオプションを考慮して選択します。しかし、全盛期以降はcpio
フォーマットが改善され、標準化されたpax
アーカイブ形式に統合されました。もそうですtar
。
厳密なPOSIX -pax
標準では%T
リストモード形式の修飾子を指定しますが、ファイルの変更時間に基づいてアーカイブメンバーを直接フィルタリングするオプションを提供する可能性はほとんどありません。それにもかかわらず、pax
私が知っている限り、最も一般的に使用される実装は、以下で管理するBSDバージョンです。ミラビロス- 実際にこれを直接アクセス可能なCLIスイッチに拡張しました。
たとえば、./
Last Modifiedにルートを持つツリー内のすべてのファイルのみをコピーするには、次のようにしますccyymmddHHMM
。/target/dir
pax -rwT,201301010000 ./ /target/dir
サブディレクトリが繰り返されるのを防ぐには、次のようにします。
pax -rwdT,201301010000 ./* /target/dir
よりman
詳しくはページをご覧ください。