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 1
xargs
검색할 줄바꿈으로 구분된 인수를 전달하는 옵션입니다 .
-I @
옵션은 이 경우에 @
의해 호출되는 유틸리티에 트랩될 수 있는 기호의 인수를 압축합니다 . 보다 구체적으로 옵션은 name.list에서 읽은 각 줄의 기호로 수정 됩니다 .xargs
find
-path
find
@