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


9

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

回答:


13

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

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 

1
`-exec mv {} / your / target / directory \; 'にならない '-print 0の代わりに| xargs -0 cp -t / your / target / directory 'は、名前のスペースの問題に関して同じように機能しますか?(また、OP はコピーではなく移動したかった)
ハーゲンフォンアイツェン

^^はい。どちらも同じ目的を達成します。
シバム

4

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

  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

2

この問題はおそらくあなたの問題と非常に同じだと思います。これも確認できます。サブディレクトリを作成し、日付順にファイルを整理します

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

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


1
あなたは、いくつかの例外処理を追加したい場合がありますので、スクリプトが動かない自分自身を2015ディレクトリ。
G-Manは「

1

おそらく、バッチ操作にはバッチツールを使用する必要があります。これを行うと、通常、たとえば、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ページをご覧ください。


私は本当に学ぶべきだと思いますpaxtarcpioそれでも私によく立ちます。+1
ロアイマ

@roaima-厳密に言えば、実際のpaxアーカイブ形式ustar形式の拡張)がありますが、POSIX仕様のpax ユーティリティは、cpio、pax、およびustar形式の読み取り/書き込みを行います。3つのアーカイブタイプはすべて、主に、ファイルの実際のデータと一緒に多くのファイルのメタデータを単一のストリームにエンコードするさまざまな手段に相当するため、実際にはそれほど大きくはありません。私は一度書いたshitar-ほとんどが-のためのシェルスクリプトの数行だったdd- tarPOSIX仕様に基づいて、その場でブロック開発者をINGの。
mikeserv 2015年

リンクされたスクリプトが好きです。奇妙なことに、2、3か月前はまったく同じ目的で非常に便利でした。しかたがない。私は使用をやめようとするかもしれませんcpio -H ustar...
roaima '26
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.