2012-11-27 4 views
2

find 명령의 결과에서 심볼릭 링크 (소프트 링크)를 만들려고합니다. 나는 파일 이름 앞에 ./을 제거하기 위해 sed를 사용하고 있습니다. 나는 링크를 저장할 경로의 끝에 파일 이름을 붙여 넣을 수 있도록이 작업을 수행하고 있습니다. 나는 우분투 서버 8.04와 함께이 일을하고있다. 찾기에서 심볼릭 링크 생성

나는 그러나 결과 파일 이름, 그래도 작동하지 않았다

How do I selectively create symbolic links to specific files in another directory in LINUX?

됐습니다 - 나의 문제에 대한 해결책의 종류이 게시물에서 배운, 그래서 AWK를 배우려고 시작 그리고 나서 sed를 결정했다.

저는이를 수행하기 위해 한 줄짜리 루프를 사용하고 있습니다. 문제는 루프의 구조가 파일 이름을 분리하여 파일 이름의 각 단어에 대한 링크를 만드는 것입니다. 꽤 많은 파일이 있고 링크 된 파일의 파일 이름을 가져 오는 각 링크로 프로세스를 자동화하고 싶습니다.

저는 기본적인 bash 명령에 익숙하지만 커맨드 라인 전문가는 아닙니다. 나는 이것을 ls와 awk로 시작하고 찾아서 움직이면서 움직였다. 내 sed 구문은 아마 더 좋을 수도 있지만 이틀 동안 이것을 배웠고 나는 지금 막 달라 붙어있다. find -type f -name "*txt*" | sed -e 's/.//' -e 's$/$$'; do echo ln -s $t ../folder2/$t;에서 t에 대한

어떤 도움이나 조언이 크게 감상 할 수

을 수행. 감사.

+0

당신은 피할 수'/'목록을 전달하여 find''의 출력한다. 경로. 'find */-options ...'나는 옵션도있을 것이라고 생각한다. – tripleee

+0

작동하지 않는 링크의 문제점은 상대 경로 이름이 링크 대상과 관련이 있어야한다는 것입니다. 루프 하나의 디렉토리를 시작하기 위해 다시 작성 ('find source -options ... -exec ln -s '{}'target \;'), 절대 경로를 사용하거나'sed' 스크립트를 확장하여 링크 대상을 목적지 (trivially 앞에'../ source /'를 추가하십시오). 'ln -s'에 대한 첫 번째 인수는 어떤 식 으로든 재 작성되지 않으며, 심볼릭 링크의 내용으로 축약되어 사용됩니다. 링크 작성시 기존 파일로 해석되는지 여부 또는 요구 사항이 없습니다. – tripleee

+0

당신은'sed 's %^\ ./%%''를 의미한다고 생각합니다. 정규 표현식에서 슬래시를 허용하기 위해'sed'는 's' 명령 다음에 구두점 문자를 사용할 수 있습니다. 단, 슬래시는 전통적인 기본 구분 기호이며'vi '에서 검색 문자를 모방하고'ed ' 그것. 또는 분리 문자를 백 슬래시 이스케이프하여 표현식에서 리터럴 문자로 인용 할 수도 있습니다. – tripleee

답변

2

은 다음과 같이 루프에 대한 귀하의 실행 :

(IFS=$'\n'; for t in `find -type f -name "*txt*" | sed 's|.*/||'`; do ln -s $t ../folder2/$t; done) 

만 줄 바꿈에 IFS를 설정하면 공간에서 갈라지고없이 전체 파일 이름을 읽을 수 있어야합니다.

대괄호는 루프가 하위 셸에서 실행되고 현재 셸의 IFS가 변경되지 않도록합니다.

+0

고마워요! 그게 내가 찾고 있던거야. 내가 find와 sed 명령을 제대로 사용하고 있는지 확인하지 못했고 필요한 부분을 어디에서 수정해야하는지 알 수있었습니다. 독서에서 sed에서 다른 문자 (예 : %)를 사용할 수 있음을 알았습니다. 내가 사용한 예제는 $를 사용 했으므로 노력했지만 효과가있었습니다. 귀하의 도움말을 사용하여 내 sed 구문을 수정하려고 노력하고 잘하면이 일을 얻을. 다시 한번 감사드립니다. – mark

6

쉽게 : 당신이 파일을 가지고 싶어 할 폴더

이동합니다

find /path/with/files -type f -name "*txt*" -exec ln -s {} . ';'