스크립트를 사용하여 폴더 병합

스크립트를 사용하여 폴더 병합

파일이 서로 덮어쓰도록 특정 순서로 병합해야 하는 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 {} +

관련 정보