디렉토리 구조의 모든 파일을 심볼릭 링크한 다음 해당 디렉토리에 있는 특정 확장자의 파일을 복사할 수 있는 방법이 궁금합니다. 기본적으로 /foo/a,b,c 내의 모든 파일을 /bar/a,b,c에 심볼릭 링크한 다음 특정 확장자를 가진 특정 파일을 복사합니다.
답변1
/bar 디렉토리에서 이러한 확장자를 제외한 모든 항목에 대한 모든 심볼릭 링크를 생성합니다.
find ../foo/ -type f ! -name '*.txt' ! -name '*.baz' -exec ln -s '{}' \;
그런 다음 모든 확장명을 복사하려면 대부분 동일한 명령을 사용합니다.
find ../foo/ -type f \( -name "*.txt" -o -name "*.baz" \) -exec cp '{}' ./ \;
편집하다: 전체 디렉토리 구조를 복사하고, 일부 파일을 심볼릭 링크하고, 다른 파일을 복사합니다. 처음에는 단일 명령으로 이것이 가능한지 확실하지 않았지만 find를 사용하여 다른 편리한 트릭을 배웠습니다.
find foo/ -type d -printf "mkdir -vp 'bar/%p'\n" -o -type f ! -name "*.txt" ! -name "*.baz" -printf "ln -vs '../%p' 'bar/%p'\n" -o -type f \( -name "*.txt" -o -name "*.baz" \) -printf "cp -v %p bar/%p\n" | sh
mv bar/foo/* bar/ && rm -R bar/foo/
주목해야 할 중요한 점은 심볼릭 링크를 만들 때 foo/와 관련하여 링크가 취할 실제 경로를 제공한다는 것입니다. 내 예에서는 상대 링크가 나란히 있을 때 표시됩니다(절대 기호 링크도 만들 수도 있음).