특정 파일이 포함 된 모든 폴더를 복사하는 방법


17

FLAC 음악 폴더 만 백업하고 싶습니다. FLAC 파일은 폴더 안에 다음과 같이 중첩 될 수 있습니다.

AlbumName/
├── Files/
│   ├── someSong01.flac
│   ├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

하나 이상의 FLAC 파일 내부에 포함 된 해당 구조와 내용으로 모든 AlbumName 폴더를 복사하고 이동하는 방법 (음악이 FLAC 형식 임)

편집 : FLAC 파일 중첩 할 수 있습니다. 그래서 나는 가질 수있다 :

AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
|   └── someCover02.jpg

FLAC 파일뿐만 아니라 모든 내용이 들어있는 폴더를 복사하여 다른 디렉토리에 붙여넣고 싶습니다.

내가 가지고 있다면

AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
|   └── someHiddenSong.flac

AlbumName4/
├── Files/
│   ├── someSong01.mp3
│   ├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

다른 디렉토리 AlbumName, AlbumName2 및 AlbumName3에 재귀 cp를하고 싶지만 AlbumName4는 아닙니다.

편집 : 어떤 대답도 실제로 내가 원하는 것을하고 있지 않았으므로 다음과 같은 것을 사용하게되었습니다.

 find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done

기본적으로 모든 flac 파일을 나열하고 awk를 사용하여 루트 폴더를 검색하고 복제본을 삭제하고 원하는 작업을 수행합니다.


목적지가 어디입니까?
George Udosen

flac 파일 만 복사하거나 하나 이상의 flac 파일이있는 전체 폴더 만 필요합니까?
아무도

@nobody 폴더 : " 하나 이상의 FLAC 파일 내부에 포함 된 해당 구조와 내용 으로 모든 AlbumName 폴더를 복사하고 이동하는 방법 "
terdon

답변:


19

옵션은 flac 파일 만 복사하고 디렉토리 구조를 유지하는 rsync를 사용하는 것입니다.

rsync -avzm --include=*/ --include=*.flac --exclude=* albums/ backup/
  • 아카이브
  • v 상세
  • z 전송 중 압축 (같은 컴퓨터에서 복사가 유용하지 않을 수 있음)
  • 빈 먼지 제거
  • 먼저 모든 디렉토리를 포함
  • 두 번째 포함 flac 파일 포함
  • 마지막 제외는 다른 모든 파일을 제외합니다

정말? 그는 디렉토리 구조를 보존하고 싶다는 것을 이해합니다. "모든 AlbumName의 폴더를 해당 구조와 내용으로 복사하고 이동하려면 어떻게해야합니까?"
아무도

2
아, 알겠습니다 확실하지 않습니다. flac 파일 만 복사하거나 하나 이상의 flac 파일이있는 전체 폴더 만 필요합니까?
아무도

질문은 편집되었으며 이제는 fricadelle이 무엇을 원하는지 더 자세히 설명합니다. flac 파일이 있으면 모든 내용을 복사해야한다는 점을 고려할 때 flac 파일 만 복사하므로 대답이 잘못되었습니다. 그러나 여전히 다른 목적으로 유용 할 수 있습니다.
아무도

9

안녕 내 친구 당신은 사용할 수 있습니다

mkdir newdirectory
cp -r --parents */*.flac newdirectory/

2
--parents이전에는 사용하지 않은 것이 좋습니다 !
George Udosen

4
이것을 설명하십시오 */*.flac! 윌 cp -r --parents AlbumName/ newdirectory/충분하지?
George Udosen

3
질문에서, flac가 중첩 된 디렉토리에 있거나 없을 수있는 것처럼 들리므로 globstar ( shopt -s globstar) 를 활성화 한 다음 **/*.flacglob에 사용 하는 것이 좋습니다 . 이중 별은 0 개 이상의 디렉토리와 일치합니다.
wjandrea

당신은 모든 사람들이 이해할 수 있도록 내 질문을 수정하자, 정확히 바로 wjandrea 있습니다
fricadelle

5

좋은 답변

한 가지 더 방법을 추가하고 싶습니다. findcpio 의 조합을 사용할 수도 있습니다.

find . -name "*.flac" -print0|cpio --null -pdm destination/

설명:

GNU find searches the directory tree rooted at each given file name by evaluating the given expression from left to right, according to the rules of precedence (see Operators), until the outcome is known (the left-hand side is false for AND operations, true for OR), at which point find moves on to the next file name.

GNU cpio is a tool for creating and extracting archives, or copying files from one place to another. It handles a number of cpio formats as well as reading and writing tar files.

3 개의 cpio 모드가 있습니다 :

  • 복사 모드 : In copy-out mode, cpio copies files into an archive. It reads a list of filenames, one per line, on the standard input, and writes the archive onto the standard output.

  • 복사 모드 : In copy-in mode, cpio copies files out of an archive or lists the archive contents. It reads the archive from the standard input.

  • 복사 패스 모드 : In copy-pass mode, cpio copies files from one directory tree to another, combining the copy-out and copy-in steps without actually using an archive. It reads the list of files to copy from the standard input; the directory into which it will copy them is given as a non-option argument.

여기서는 복사 패스 모드를 사용하고 있습니다.

  • 위 명령에서 사용 된 옵션 :

찾기:

  • -name-> filename 또는 full-name을 쓰는 대신 정규식을 사용하십시오.

cpio :

  • '-m, --preserve-modification-time' Retain previous file modification times when creating files.
  • '-p,-통과' Run in copy-pass mode. see ``Copy-pass mode``.
  • '-d, --make-directories' Create leading directories where needed.'
  • --quiet' 복사 된 블록 수를 인쇄하지 마십시오 .`

New options are the "-print0" available with GNU find, combined with the "--null" option of cpio. These two options act together to send file names between find and cpio, even if special characters are embedded in the file names.

rsync쉘 구조를 사용하여 파일을 찾고 복사하기 위해 쉘 스크립트를 사용 하거나 작성할 수도 있습니다 .

Rsync에 대한 설명은 위의 답변을 살펴보십시오.


2
명령 및 제안하는 옵션에 대한 설명을 포함하여 답변을 향상시킬 수 있습니다. - 검토에서
J. STARNES

@dessert 네, 맞습니다. 당신의 완벽한 제안에 감사드립니다.
bsdboy

4

답 1 : 당신은 또한 find같은 명령을 사용할 수 있습니다 .

mkdir newDir && find AlbumName/ -iname "*.flac" -exec cp --parents "{}" newDir/ \;

설명 :

mkdir새 디렉토리를 만듭니다. find명령은 폴더 *.flac에있는 파일을 찾습니다 AlbumName. execcommand 는 반환 된 cp각 파일 이름에 대해 명령을 실행 find합니다.

2 답변 : 당신은 또한 사용할 수 find와 명령을 xargs뿐만 아니라

mkdir newDir && find AlbumName/ -iname "*.flac" | xargs -I{} cp --parents {} newDir/

추가 정보 : 찾기 , xargs


1
find | xargs공백이있는 파일 이름이 손상되므로 find -print0 | xargs -0대신 사용하십시오.
디저트

1 2.flac파일 이름에 공간이있는 파일로 시도했습니다 . find | xargs실패한 파일 이름을 알려주십시오 .
mf_starboi_8041

예를 들어 here
디저트

나도 몰라하지만 사용하지 않고 긴 공간을 가진 파일을 복사 할 수 있습니다find -print0 | xargs -0
mf_starboi_8041

시도하십시오 touch "a space" && find . | xargs ls.
디저트

0

내 음악 라이브러리에서 동일한 문제를 해결하고 다음과 같은 스크립트를 사용하여 해결했습니다. 한 번만 사용하려고하므로 변수를 사용하여 완전히 엔지니어링하지 않았습니다. :).

스크립트는 rsync를 사용하여 다른 모든 파일 및 하위 디렉토리를 포함하여 flac 파일을 포함하는 모든 디렉토리를 새 위치로 이동합니다. rsync를 사용하면 프로세스 중에 스크립트가 중지되면 스크립트를 다시 시작할 수 있습니다.

내 도서관 구조 :

library
|-artist
  |- album 1 (mp3)
  |- album 2 (flac)

새로운 라이브러리 구조 :

library
|-artist
  |- album 1 (mp3)

library-lossless
|-artist
  |- album 2 (flac)

(1) SOURCE 대상에서 다음 쉘 스크립트를 시작하십시오 (TARGET을 선택한 각 디렉토리로 바꾸십시오-나는 절대 경로를 사용했습니다)

1 행 : FLAC 파일과 파이프를 포함하는 모든 디렉토리를 찾을 수 있습니다 (|) 그런 종류의에
행 2 : 종류와 파이프 제거 중복이에 목록 루프 할
행 3 : 각 디렉토리를 위해 할
프로세스의 디렉토리를 보여 행 4
행 5 : 대상 디렉토리에 rsync를 추가하고 대상 위치
행 6 에서 소스 제거 및 구조 (-R) 유지 : 빈 디렉토리 제거 (rsync는 파일 만 제거하므로)

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    echo $dirname
    rsync -azvm -R --remove-source-files "${dirname}" TARGET
    find "${dirname}" -type d -delete
done

(2) (1)에서 스크립트를 성공적으로 실행 한 후 소스 디렉토리에서 다음 명령을 실행할 수 있습니다.

find . -depth -type d -empty -delete

이 명령 은 스크립트 내에서 삭제되지 않은 모든 디렉토리를 삭제합니다. 즉, 모든 하위 폴더 / 앨범에 flac 파일이 포함 된 "아티스트"디렉토리.

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