와일드카드를 통한 다중 심볼릭 링크: "ln -s ../*/*.txt TXT/"

와일드카드를 통한 다중 심볼릭 링크: "ln -s ../*/*.txt TXT/"

아래 예와 같이 와일드카드를 사용하여 여러 심볼릭 링크를 만들려고 합니다.

$ ls -R
.:
TXT  a  b

./TXT:

./a:
a.txt

./b:
b.txt

a, b, TXT 등 다양한 하위 디렉터리를 포함하는 "상위 디렉터리"가 있습니다. "a"와 "b"에는 다양한 텍스트 파일(위 예에서는 a.txt, b.txt)이 있습니다.

"TXT" 하위 디렉터리의 각 ".txt" 파일에 대해 "상대" 심볼릭 링크를 만들고 싶습니다. 하지만:

  • "찾기"를 사용하지 않음
  • TXT 디렉토리에 "cd"가 없습니다

즉, 다음과 같은 명령이 작동하지 않는 이유를 알고 싶습니다.

ln -s ../*/*txt TXT/

이전의 "cd TXT"를 사용하면 다음과 같이 작동합니다.

cd TXT
ln -s ../*/*txt .

나는 bash가 "*"와 "../"를 확장하기 때문에 문제가 발생한다고 생각합니다. bash는 "../*/*.txt"를 확장할 수 없습니다. 왜냐하면 해당 파일이 실제로 존재하지 않기 때문입니다. 따라서 "ln"은 필요한 링크를 생성할 수 없습니다. : 현재 작업 디렉토리를 기준으로 "한 레벨 위" 디렉토리에 txt 파일에 대한 링크를 생성합니다. ".."로 "cd"하고 이 수준의 모든 디렉터리를 고려하여 ".txt" 파일을 찾습니다.

아마도 "규칙"은 심볼릭 링크 TARGET이 다음을 수행해야 한다는 것일 수 있습니다.

  • 또한 실제 파일을 가리킵니다(그렇지 않으면 bash는 ".." 또는 "*"를 올바른 방식으로 확장할 수 없습니다).
  • 링크가 포함된 디렉터리에 상대적이어야 합니다.

정확히 무엇이 문제이고 가능한 해결책이 무엇인지 확인하고 설명할 수 있습니까?

추신. "find"를 사용하면 다음과 같은 명령이 작동하는 것 같습니다.

find ./ -path ./TXT -prune -o -iname "*.txt" -type f -exec ln -s ."{}" -t TXT/ \;

이 경우에도 "존재하지 않음" 경로를 사용해야 합니다.

."{}"

그러나 -exec 명령은 "{}"(예: "./a/a.txt" 및 "./b/b.txt")만 확장하므로 "ln"은 접두사를 추가하여 TXT 대상 디렉터리를 기준으로 올바른 경로 지점을 구축할 수 있습니다. ". ".

답변1

이 명령을 사용하고 있습니다

ln -s ../*/*txt TXT/

ab가 포함된 디렉토리에 있는 경우 쉘은 또는 의 항목 과 일치하도록 TXT확장할 수 없습니다 . 이를 사용해야 하지만 내부의 심볼릭 링크는 한 수준에서 벗어나 상대 경로에 다른 수준이 필요합니다.../*/*txtab*/*txtTXT../

가장 간단한 해결책은 이것이겠지만, 당신은 피하고 싶다고 하셨습니다.cd

( cd TXT && ln -s ../*/*txt . )

또 다른 해결 방법은 링크를 순서대로 수정해야 합니다.

for f in */*txt
do
    ln -s ../"$f" TXT
done

소스 디렉터리가 있고 ab동일한 수준에 있으므로 TXT두 제안의 와일드카드는 세 디렉터리 모두와 일치합니다.

관련 정보