![지정된 모든 텍스트 파일을 수집하고 이름을 바꾸고 폴더에 복사하는 명령](https://linux55.com/image/217582/%EC%A7%80%EC%A0%95%EB%90%9C%20%EB%AA%A8%EB%93%A0%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%88%98%EC%A7%91%ED%95%98%EA%B3%A0%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BE%B8%EA%B3%A0%20%ED%8F%B4%EB%8D%94%EC%97%90%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EB%AA%85%EB%A0%B9.png)
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
다음 명령을 사용할 수 있습니다.