特定の数のファイルを別のディレクトリに移動またはコピーする方法

特定の数のファイルを別のディレクトリに移動またはコピーする方法

特定の数のファイルを別のディレクトリに移動またはコピーする方法を知りたいです。

例:ディレクトリに880個のファイルがあり、150個のファイルをtoディレクトリから移動またはコピーするA場合は、150〜300個のファイルをtoディレクトリから移動またはコピーします。ABAC

私はこのコマンドを試しました

$ find . -maxdepth 1 -type f | head -150 | xargs cp -t "$destdir"

しかし、これは880個のファイルをディレクトリにコピーすることです。B

答え1

150ファイルの可能な解決策mv

mv `find ./ -maxdepth 1 -type f | head -n 150` "$destdir"

mvコピーに置き換えますcp

テストケースは次のとおりです。

mkdir d1 d2
cd d1
touch a b c d e f g h i j k l m n o p
cd ../
mv `find ./d1 -type f | head -n 5` ./d2/

結果:

ls d1 d2
d1:
b  c  d  e  g  h  i  k  m  n  o

d2:
a  f  j  l  p

編集する:

あなたのコメントに答える簡単なスクリプトは次のとおりです。

#!/bin/sh
# NOTE: This will ONLY WORK WITH mv.
# It will NOT work with cp.
#
# How many files to move
COUNT=150
# The dir with all the files
DIR_MASTER="/path/to/dir/with/files"
# Slave dir list - no spaces in the path or directories!!!
DIR_SLAVES="/path/to/dirB /path/to/dirC /path/to/dirD"

for d in $DIR_SLAVES
do
    echo "Moving ${COUNT} to ${d}..."
    mv `find ${DIR_MASTER} -maxdepth 1 -type f | head -n ${COUNT}` "${d}"
done

exit

注:サンプルスクリプトはテストされていませんが、機能します。

答え2

シェルがそれをサポートしている場合は、process substitution次のことを試すことができます。

最初の150個のファイルはdestdir_Bにコピーされ、次の300個のファイルはdestdir_Cにコピーされます。残りは変更されません。

{
   head -n 150 | xargs -t cp -t "$destdir_B"
   head -n 300 | xargs -t cp -t "$destdir_C"
} <(find . -maxdepth 1 -type f)

これには、外部ファイル名を処理できないという一般的な警告が含まれます。

<(...)がない場合は、検索結果をファイルに保存してからファイルを{...}にリダイレクトできます。

ファタイ

関連情報