입력 목록과 부분 파일 경로를 사용하여 파일 찾기 및 복사

입력 목록과 부분 파일 경로를 사용하여 파일 찾기 및 복사

names.list이름만 포함된 파일 이름 목록이 있습니다. 파일은 시스템 전체의 다양한 하위 폴더에 분산되어 있지만 구조는 일반적으로 다음과 같습니다.

uniquename/uniquename2/spades/filtered/filename

상수는spades/filtered

나는 사용했다다음 명령디렉토리에서 파일을 이동할 때

xargs -a file_list.txt cp -t /path/to/dest

사용 중에 이 스레드를 발견했습니다.와일드카드/부분 파일 이름에스

find . -path \*content/docs/file.xml

이렇게 조합해보려고 해요

find . -path \*spades/filtered/ | xargs -a names.list cp -t $HOME/destination/

하지만 다음과 같은 오류가 발생합니다.

cp: cannot stat `filename': No such file or directory

tldr: 입력된 이름 목록과 부분 파일 경로만 사용하여 파일을 복사하고 싶습니다.

답변1

파일 이름을 반복하고 찾기 패턴에 추가하여 exec 핸들을 사용하여 복사합니다.

for i in $(<names.list)
do
    find . -path \*spades/filtered/"$i" -type f -exec cp -t "$HOME/destination/" {} \;;
done

편집하다: Rakesh Sharma의 답변 덕분에 루프 본문을 다음으로 바꾸십시오.

find . -mindepth 5 -maxdepth 5 -path "*/spades/filtered/$i" -type f -exec cp -t "$HOME/destination/" {} +;

후원.

답변2

for루프를 취소하고 다음을 수행할 수 있습니다 xargs.

xargs -a names.list -L 1 -I @ find . -path \*/spades/filtered/@ -type f -exec cp -fpvt "$HOME/destination/" {} +

GNU xargs, find 및 cp 유틸리티가 사용된다고 가정합니다.

-a파일 이름은 한 번에 한 줄씩 읽혀집니다.

-L 1xargs검색할 줄바꿈으로 구분된 인수를 전달하는 옵션입니다 .

-I @옵션은 이 경우에 @의해 호출되는 유틸리티에 트랩될 수 있는 기호의 인수를 압축합니다 . 보다 구체적으로 옵션은 name.list에서 읽은 각 줄의 기호로 수정 됩니다 .xargsfind-pathfind@

관련 정보