1行にファイルグループを移動する方法

1行にファイルグループを移動する方法

あるディレクトリから別のディレクトリに1000個のファイルを移動したいと思います。元のディレクトリにあればできますが、これを行うだけです。

mv $(ls /home/jeremy/source|tail -1000) /home/jeremy/dest

他の場所ではパスが削除されるため、何らかの方法でパスを追加する必要があります。私は$が便利だと思ってトリッキーに見えるので、xargsを避けたいです。

答え1

コマンドラインが長すぎず、コマンドが機能している場合は、xargs次のように使用できます(トリッキーです)。

 ls /home/jeremy/source | tail -1000 | xargs mv -t /home/jeremy/dest

これは、ファイル名(またはパス)に改行やその他の特殊文字がないと仮定します。それ以外の場合は、tailが正しく機能せず、xargsがパーティションファイル名を取得します(指定しない限り、行で動作するためxargs -0)。

パラメータを使用すると、ターゲットにコピーする必要があるファイルパラメータの前にターゲットディレクトリを指定-tできます。mv

答え2

GNUの最新の[1]バージョンを使用しfindutilsて、次の手順を実行しますcoreutils

find /home/jeremy/source -print0 | 
    tail -z -n 1000 | 
    xargs -0 -r mv -t /home/jeremy/dest/

-print0および-zオプションは、-03つのツールすべてがNUL文字をファイル名/レコード区切り文字として使用するように指示します。これにより、ファイル名に文字を含むパイプを安全に使用できます。

tailあなたのバージョンがheadこのオプションをサポートしていない場合は、改行文字を-zファイル名区切り文字として使用できます(改行文字を含むファイル名以外のファイル名には安全です)。

find /home/jeremy/source | 
    tail -n 1000 | 
    xargs -r -d '\n' mv -t /home/jeremy/dest/

しかし、xargsまったく面倒ではありません。これはstdinからデータを取得し、それを使用してプログラムを実行する非常に簡単なコマンドです(stdinのデータはプログラムのコマンドラインで引数として使用されます)。これは非常に便利なツールであり、学習に少し時間を費やす価値があります。

さらに$(ls ...)、類似して似ていますが、xargsスペース、シェルワイルドカード(ワイルドカードなど)を含むほとんどの問題(NULを区切り文字として使用する場合)を防ぐため、よく書かれたスクリプトはこれらの問題によって破損しないように注意する必要があります。 。


[1] いつ option があったのかhead分かりませんが、ここ数年、多くの GNU ツール (NUL を含む) が NUL を入力レコード区切り文字として使用する機能を得ています。その前に。tail-zsortfindxargs

便利なNUL区切り文字-zを失うことなく、これらのオプションを使用して長くて複雑なパイプラインを構築できるため、これは非常に便利です。-Z-0

関連情報