아래 예와 같이 와일드카드를 사용하여 여러 심볼릭 링크를 만들려고 합니다.
$ 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/
a
b
가 포함된 디렉토리에 있는 경우 쉘은 또는 의 항목 과 일치하도록 TXT
확장할 수 없습니다 . 이를 사용해야 하지만 내부의 심볼릭 링크는 한 수준에서 벗어나 상대 경로에 다른 수준이 필요합니다.../*/*txt
a
b
*/*txt
TXT
../
가장 간단한 해결책은 이것이겠지만, 당신은 피하고 싶다고 하셨습니다.cd
( cd TXT && ln -s ../*/*txt . )
또 다른 해결 방법은 링크를 순서대로 수정해야 합니다.
for f in */*txt
do
ln -s ../"$f" TXT
done
소스 디렉터리가 있고 a
와 b
동일한 수준에 있으므로 TXT
두 제안의 와일드카드는 세 디렉터리 모두와 일치합니다.