특정 개수의 파일을 다른 디렉터리로 이동하거나 복사하는 방법을 알고 싶습니다.
예: 디렉터리에 880개의 파일이 있고 150개의 파일을 to 디렉터리에서 이동하거나 복사 A
하려는 경우 150~300개의 파일을 to 디렉터리에서 이동하거나 복사 합니다 .A
B
A
C
나는 이 명령을 시도했다
$ 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)
이는 외부 파일 이름을 처리할 수 없다는 일반적인 경고와 함께 제공됩니다.
<(...)가 없으면 찾기 결과를 파일에 저장한 다음 해당 파일을 {...}로 리디렉션할 수 있습니다.
화타이