지정된 모든 텍스트 파일을 수집하고 이름을 바꾸고 폴더에 복사하는 명령

지정된 모든 텍스트 파일을 수집하고 이름을 바꾸고 폴더에 복사하는 명령

file.txt라는 텍스트 파일이 수천 개 있습니다. 모두 같은 이름을 공유하기 때문에 덮어쓰지 않고는 같은 폴더로 이동할 수 없습니다.

수천 개의 디렉터리와 하위 디렉터리에서 모든 file.txt 파일을 찾고, 파일 이름 끝에 전체 경로 이름을 추가한 다음, 원래 폴더의 위치는 그대로 유지하면서 지정된 폴더에 복사하는 명령이 필요합니다.

예:

from: file.txt 
to: a/123/file.txt

(파일 이름에 /를 사용할 수 없다는 것을 알고 있으므로 시각적으로 더 적절한 대체가 없으면 하이픈이나 밑줄이 작동합니다)

또한 일부는 file.txt이고 일부는 File.txt이고 끝에 선택적 "S"가 있으므로 명령은 대소문자를 무시해야 합니다(file.txt 또는 files.txt).

이름을 바꾸는 동안 디렉터리/하위 디렉터리 이름이 무작위이므로 대소문자를 변경하지 않고 경로를 있는 그대로 추가하고 싶습니다(예: a/adgDGeRddsdvvsdGSD/[fF]ile[s].txt

감사해요!

답변1

쉘 스크립트를 사용하여 find경로를 시작 디렉토리에 대한 상대 경로로 변환하고 다음 /으로 바꿉니다 _.

find . -type f -iname 'file*.txt' -exec sh -c '
    targetdir=$1; shift
    for file; do
        cp "$file" "$targetdir/$(realpath --relative-base=. "$file" | tr '/' '_')"

        # uncomment to restrict the filename to the last 4 directories
        #cp "$file" "$targetdir/$(realpath --relative-base=. "$file" | 
        #   rev | cut -d'/' -f-5 | rev | tr '/' '_')"
    done
' sh /tmp/dest {} +

명령을 실행하기 전에 /tmp/dest대상 디렉터리와 cd파일의 상위 디렉터리 로 바꾸십시오.

입력 디렉터리 구조의 예:

.
├── dir1
│   ├── file.txt
│   └── sub1
│       └── file.txt
├── dir2
│   └── file.txt
└── file.txt

출력 /tmp/dest:

dir1_file.txt
dir1_sub1_file.txt
dir2_file.txt
file.txt

답변2

나는 이렇게 할 것이다:

while read -r file; do mv $file /path/to/dir/$(echo $file | tr '/' '_'); done < <(find / -name *.txt -type f 2>/dev/null)

그러면 명령의 모든 결과가 반복되어 find원하는 디렉터리로 이동됩니다.

복사하려면 cp다음 명령을 사용할 수 있습니다.

관련 정보