여러 폴더의 여러 파일을 하나의 폴더로 복사

여러 폴더의 여러 파일을 하나의 폴더로 복사

여러 폴더의 여러 파일을 하나의 폴더로 복사하고 복사된 디렉터리에 따라 이름을 변경하는 방법은 무엇입니까?

초기 디렉터리 계층 구조:

folder1/
    file1.gz
    filexyz.gz

folder2/
    file1.gz
    filexyz.gz

folder3/
    file1.gz
    filexyz.gz

결과:

folder1_file1.gz
folder2_file1.gz
folder3_file1.gz
folder1_filexyz.gz
folder2_filexyz.gz
folder3_filexyz.gz

답변1

간단한 쉘 루프를 사용하여 파일을 값으로 지정된 디렉토리에 복사해야 한다고 가정합니다 $destdir.

for pathname in */*.gz; do
    cp -i -- "$pathname" "$destdir/$( dirname -- "$pathname" )_$( basename -- "$pathname" )"
done

답변2

사전 이름/이름 바꾸기(Larry Wall의 Perl 이름 바꾸기라고도 함) 사용( renameDebian/Ubuntu, prenameRHEL/CentOS, IIRC에서):

folder1, , folder2의 상위 항목 folder3:

rename -n s:/:_: */*

-n"시험 실행" 매개변수입니다. 이름 변경이 좋아 보이면 "-v"로 바꾸거나 제거하세요.

기본적으로 이는 현재 디렉터리에서 현재 디렉터리 directory/file로 파일을 이동합니다. directory_file여러 폴더 수준이 있고 bash를 사용하는 경우 다음을 사용할 수 있습니다.

shopt -s globstar   # Possibly already set, necessary for the "**"
rename -n s:/:_:g **/*

그러면 파일이 현재 디렉터리에서 현재 디렉터리 some/path/to/file로 이동됩니다.some_path_to_file

답변3

이 같은?

#!/bin/bash -ex
DESTDIR="PATH/TO/FINAL/DESTINATION/DIRECTORY"
for DIRS in /PATH/TO/YOUR/DIRECTORIES/*/;
do
    for FLES in $DIRS*.gz;
    do
        cp $FLES $DESTDIR/$(echo $(basename $DIRS)"_"$(basename $FLES))
    done
done

편집: OP가 문제를 스스로 해결하려고 시도했다는 것을 보여주지 않았기 때문에 코드에 설명을 추가하기에는 너무 게으르다. 하지만 무슨 일이 있어도 우리는 도와야 합니다. 그래서 제가 이 글을 게시하는 이유입니다.

답변4

이 시도,

  find folder[1-3] -type f -name '*.gz' | while read -r FILE; do cp "$FILE" "${FILE//\//_}"; done
  • folder[1-3]소스 위치.
  • -type f파일만 검색합니다.
  • -name '*.gz'파일 이름 접미사는 ​​입니다 .gz.
  • ${FILE//\//_}"/"를 밑줄로 바꾸세요.

관련 정보