파일이 서로 덮어쓰도록 특정 순서로 병합해야 하는 417개의 폴더 경로 목록이 있습니다. 나중에 폴더를 변경할 때 이 작업을 다시 수행해야 할 수도 있으므로 수동으로 수행하지는 않을 것입니다. 이 작업을 수행하는 스크립트를 작성하는 방법을 배우고 싶습니다.
또한 스크립트가 모든 것을 소문자로 변환할 수 있다면 좋을 것입니다. 제가 이것으로 한 것은 압축하지 않고 압축한 다음 -LL로 압축을 푸는 것뿐이었습니다. 하지만 더 이상 그렇게 할 필요가 없다면 괜찮을 것입니다. 시간이 걸렸으니까요. 잠시(17GB).
목록은 이렇습니다
"/소로/"
"/소로/"
"/소로/"
(궁금하신 분들을 위해 morrowind/openmw의 여러 모드를 병합해 보겠습니다.)
답변1
다음과 같이 작동해야 합니다.
while IFS= read -r dir
do
cp -f "$dir"/* target
done < list
파일을 복사할 디렉터리 list
인 디렉터리 목록은 어디에 있습니까? target
목록의 뒷부분에 나타나는 디렉터리의 파일은 목록의 앞부분에 나타나는 디렉터리의 파일을 덮어씁니다.
cp -f
복사 프로그램에 대해 "강제 덮어쓰기" 옵션을 지정하십시오. 이는 다음을 가정합니다.
- 디렉터리 이름에는 개행 문자가 포함되지 않습니다. (이렇게 하면 간단한 텍스트 파일에 나열할 수 없게 됩니다.)
- 목록 파일에는 실제로 따옴표가 포함되어 있지 않습니다.
- 각 디렉토리에는 (일반) 파일만 있고 하위 디렉토리나 특별한 내용은 없습니다.
- 다음으로 시작하는 파일 이름이 없습니다.
.
.
답변2
cp -r $(<sources) target/
작동해야합니다.
이는 경로가 이미 파일에 나열되어 있다고 가정합니다 sources
.
각 경로는 디렉터리 또는 파일에 대한 경로일 수 있지만 sources
파일 내의 모든 경로에는 공백(공백, 탭, 줄 바꿈 등)이나 셸 와일드카드 문자(예: *
또는 ?
)가 포함되어서는 안 되며, 문자를 묶어서는 안 됩니다. (실제 이름에 따옴표가 포함되어 있지 않은 경우)
다음과 같은 것을 사용할 수도 있습니다.
xargs -t -Isrc cp -r src target/ <sources
이렇게 하면 더 이국적인 파일 이름이 허용되지만 개행 문자가 있는 파일 이름은 허용되지 않습니다.
bash
다음은 파일 이름 집합을 소문자로 변환하는 짧은 스크립트입니다 ( echo
실제 이름 바꾸기를 수행하려면 제거해야 하며, 무슨 일이 일어나는지 볼 수 있도록 거기에 있습니다).
#!/bin/bash
for path in "$@"; do
dir="${path%/*}"
name="${path##*/}"
if [[ ! "$path" -ef "$dir/${name,,}" ]]; then
echo mv "$path" "$dir/${name,,}"
fi
done
두 경로가 모두 동일한 파일을 참조하는 경우 테스트는 true를 반환합니다 -ef
(이 경우 이름 변경이 발생하지 않아야 함). 변수 ${name,,}
대체는 실제 소문자의 역할입니다.
다음과 같이 디렉토리에 적용할 수 있습니다.
$ find target -type f -exec bash tolower.sh {} +