텍스트 파일 목록에서 Linux (mv 또는 cp) 특정 파일?


34

서버에 50,000 pdf 및 기타 파일과 같은 많은 파일 디렉토리가 있습니다. 특정 디렉토리를 다른 디렉토리로 이동해야합니다. CSV 또는 다른 텍스트 형식으로 이동 해야하는 파일 목록을 생성 할 수 있습니다.

내가해야 할 일은 bash 스크립트를 실행하고 텍스트 파일에 나열된 파일을 다른 디렉토리로 이동하거나 복사하는 것입니다.

이 작업을 수행하는 쉬운 방법이 있습니까? 어떤 제안이나 자료라도 대단히 감사하겠습니다.


또한 파일은 디렉토리에 추가 될 때 무작위로 이름이 지정됩니다. 특정 파일을 이동하는 데 사용할 수있는 명명 규칙이나 논리는 없습니다.
Jestep

답변:


26

rsync와 프로세스 (파일 목록을 취할 수있는 몇 가지 옵션이 있습니다 --files-from, --include-from등).

예를 들어, 이것은 트릭을 수행합니다.

rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory

2
예 :rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Anneb

27

쓸모없는 사용을 피하려면 cat(및 사용하지 않는 경우 rsync) :

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

파일이 줄당 하나씩 나열되면 줄 바꿈이 포함되어 있지 않으면 유효한 파일 이름을 처리합니다.


2
이 방법의 한 가지 단점은 목록의 파일에 경로 이름이 포함 된 경우 (즉, 모두 동일한 디렉토리에 있지 않은 경우) 사용 mv하면 모든 파일이 동일한 대상 디렉토리로 축소됩니다. rsync허용 된 답변 의 접근 방식에는 이러한 제한이 없습니다.
Jason R

또한이 명령을 시도했는데 xargs는 작은 따옴표 ( "일치하지 않는 작은 따옴표")가 포함 된 모든 파일에서 손상됩니다.
James Beninger

실제로 동일한 대상 디렉토리의 다른 소스 경로에서 파일을 원했기 때문에 이것은 나를 위해 일했습니다.
PseudoNoise

15
for file in `cat listoffiles`; do mv "$file" /path/of/destination ; done

bash를 가정 listoffiles하고 한 줄에 하나의 파일을 포함합니다. rsync 경로에 대한 나의 반대 의견은 OP가 파일을 복사하지 않고 파일 이동 방법을 요구한다는 것입니다. rsync는 왕실의 결혼식보다 더 많은 플래그를 가지고 있으므로 그렇게하기 위해 더 수정할 수는 있지만 때로는 더 간단합니다.


1
이 솔루션은 가장 유연합니다. 상대 파일 경로 옵션이 필요했기 때문에 cp 또는 mv 대신 rsync로 사용했습니다.
Spamwich

4
: 나는 그것을 수정 너무 좋은, 그냥은 공백 문제가 있었다while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
user1182474

1
@ user1182474 감사합니다. 입력 리디렉션을 훌륭하게 사용합니다. 그런데 대답에 만족을 나타내는 전통적인 방법은 찬성하는 것입니다!
MadHatter는 Monica

1
@ user1182474 감사합니다! 많은 수정의 마지막 단계는 OSX 백업 유틸리티를 내 Android로 이식하기 위해 다소 맹목적으로해야했습니다!
Charlie Gorichanaz

4

이것은 가지고있는 텍스트 파일의 형식에 따라 다릅니다. 예를 들어, 각 파일이 새 행에 위치하도록 작성된 파일 목록이있는 경우. 다음과 같이 xargs를 사용할 수 있습니다.

$ cat your_text_file | xargs cp -t /path/to/destination

또한 옵션 find과 함께 명령을 사용할 수 있습니다 -exec. 파일을 복사 / 이동합니다.


3
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

Rsync는 폴더가없는 경우 자동으로 폴더를 생성하므로 cpor mv명령에 비해 추가 이점이 있습니다.


/path/to/source파일 목록에서 경로를 가져올 때 왜 필요합니까?
bzero

@bzero 파일 목록에 상대 경로가 포함될 수 있습니까?
DreadfulWeather

2

나는 rsync 답변이 더 좋은 방법이라고 생각하지만 다른 옵션 만 있습니다.

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)

tar는 우분투 기본 이미지에서 사용할 수 있지만 rsync는 불가능하므로 Dockerfile에 좋습니다.
kristianp

1

실수로 전체 디렉토리를 이동하는 대신 디렉토리의 전체 내용을 대상 디렉토리에 복사했습니다. 이로 인해 원래 디렉토리가 디렉토리에 추가되는 대신 복잡한 대상 디렉토리가 생성되었습니다.

이 문제를 해결하기 위해 다음을 수행했습니다.

ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove 위 명령은 filestomove 파일을 작성합니다. 대상 디렉토리의 모든 내용 목록이 시간순으로 정렬되어 가장 오래된 것부터 가장 오래된 것입니다.

그런 다음 물건을 옮기기 위해 혼란스러운 대상 디렉토리의 하위 디렉토리를 만들었습니다.

mkdir /path/to/cluttered/destination/directory/newsubdirectory

그런 다음 화면에 나열하고 자세한 내용을 표시하는 것을 제외하고 디렉토리 목록을 반복했습니다.

ls -lrht /path/to/cluttered/destination/directory/ 이 줄에는 디렉토리가 날짜 오름차순 (시간순으로 정렬 됨)으로 정렬되어 있으며, 현재 혼잡 한 대상 디렉토리에있는 각 파일의 날짜 / 시간 스탬프를 포함하여 자세한 정보가 표시됩니다. 나는 맨 처음부터 시작하여 어떤 디렉토리와 파일을 어디에 보관하고 싶은지를 보여줍니다. 모든 새 파일이 시작되는 파일의 날짜 / 시간 스탬프에 공백이 없어야합니다.

그런 다음 위의 첫 번째 단계에서 만든 파일 (날짜순으로 정렬)을 편집하기 위해 파일을 편집하고 이전에 원래 디렉토리에서 유지하려는 목록에서 일부를 삭제했습니다.

vim /opt/dircheck/filestomove 이동하지 않으려는 모든 파일을 맨 위에서 삭제하십시오.

그런 다음이 게시물에 이미 나열된 명령을 사용하여 내 목록의 파일을 내가 만든 새 디렉토리로 옮겼습니다.

sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory

이것은 모든 파일을 순식간에 이동 시켰습니다. (참고 : 처음에는 sudo가 필요하지 않을 수 있습니다. 이는 파일 권한 문제입니다).

이제 내 원래 대상 디렉토리는 훌륭하고 깔끔하며 모든 파일과 디렉토리가 어수선한 새 디렉토리를 포함합니다.


1

파일 이름에 불쾌한 문자가없는 경우 (공백, 줄 바꿈, xargs를 사용하여 개별 인수로 나누는 방법을 혼란스럽게 함) 줄 바꿈으로 구분 된 파일 목록 (하나의 파일)을 생성하십시오 한 줄에) 같은 것을 할 수 있습니다.

cat filenames.txt | xargs mv -t /path/to/move/files/to

(일반적으로 man xargs 참조 , 굉장합니다)

특정 mv에 -t 옵션이 없으면 다음과 같은 속임수를 쓸 수도 있습니다

( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv

참고 – 파일 이름에 줄 바꿈이 있으면 예상대로 작동하지 않습니다.


하나; 이그나시오의 답변을 참조하십시오. rsync는 이런 것들을 위해 만들어졌습니다.
Kjetil Joergensen

cp, mv등은 bsd에-t 옵션 이 없으며 subshell이있는 두 번째 예제는 저에게 효과적이지 않습니다 ( 마지막 파일 이름으로 /path/to/move

1
@ w17t-filenames.txt와 같은 소리는 개행 문자로 끝나지 않으며 filenames.txt의 끝에 개행 문자를 추가하거나 다음과 같은 작업을 수행합니다.(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Kjetil Joergensen

0

다음과 같은 것을 시도하십시오 :

cat list.txt | while read line; do mv "$line" /images; done

수 있었던 while read line; do mv $line /images; done < list.txt 하나의 명령으로
ignivs

0

다음은 디렉토리 구조를 유지하면서 모든 PNG 파일을 특정 경로 (및 모든 하위 디렉토리)에서 새 위치로 복사 해야하는 곳에서 나를 위해 일했습니다.

rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

RSYNC는 먼저 디렉토리 구조의 미러를 생성 한 다음 파일을 동기화하므로 비어있는 초과 폴더로 끝날 수 있습니다. 이 빈 디렉토리를 제거하기 위해 --prune-empty-dirs 플래그를 사용했습니다.

나는 제휴 관계가 없지만이 솔루션에 영감을 준 출처를 인정하는 것이 옳다고 생각했습니다. http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.