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

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

古いハードドライブの写真をたくさん集めて整理しようとしています。を実行すると、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

古いディスクの新しいファイルを無視するには、次の手順を実行します。

  1. 必要なファイルと不要なファイルを分離するために、変更された日付を含む一時タグファイルを作成します。
  2. 表示されたファイルより古いファイルを新しい場所にコピーします。

以下は、新しいディスク上の古いディスクのディレクトリ階層を保持すると仮定するコマンドの例です(または同様のcpioコピーコマンドです)。tarpax

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
  1. copy.shこのスクリプトを前のディレクトリの指定されたファイルに書き込みます。

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

  3. ファイルを実行可能にするchmod +x copy.sh

  4. 次に、このファイルを実行してみてください。./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詳しくはページをご覧ください。

関連情報