find
명령을 실행하여 검색된 여러 책에 대한 심볼릭 링크를 만들고 싶습니다 .
먼저 JS 책을 모두 모았습니다.
find ~ -type f -iregex '.*javascript.*\.pdf' > js_books.md 2>/dev/null
35권 반납
../Coding/Books/HTML_Collections/Freeman E.T., Robson E. - Head First HTML5. Programming Building Web Apps with JavaScript - 2011.pdf
../Coding/Books/HTML_Collections/Learning Web Design - A Beginner's Guide to HTML, CSS, JavaScript, and Web Graphics - Jennifer Niederst Robbins - 4th Edition - August 2012.pdf
..
또한 js_books 디렉토리에 복사하세요.
mkdir js_books
find ~ -type f -iregex '.*javascript.*\.pdf' -print0 -exec cp '{}' js_books
작동하지만 여러 복사본이 많은 디스크 공간을 소비합니다.
그래서 나는 책을 삭제하고 그 안에 심볼릭 링크를 만들려고 노력했습니다.
find ~ -type f -iregex '.*javascript.*\.pdf' -print0 -exec ln -s '{}' js_books/'{}' \;
js_books 디렉토리에는 아무것도 반환되지 않습니다.
그러한 문제를 해결하는 방법은 무엇입니까?
답변1
표현식은 find
매우 간단하며 bash 쉘 와일드카드를 사용하여 재현할 수 있습니다.
shopt -s globstar nocaseglob
for book in $HOME/Coding/**/*javascript*.pdf
do
ln -s "$book" "js_books/$(basename "$book")"
done
먼저 bash에 대소문자를 구분하지 않는 파일 이름 글로빙을 활성화하고 하위 디렉터리를 통해 재귀할 수 있도록 지시한 **
다음 "(any)javascript(any)pdf" 패턴과 일치하는 모든 파일 이름을 반복합니다. 각 파일 이름에 대해 js_books에 대한 심볼릭 링크를 만듭니다.
각 파일 이름의 시작 부분을 생략했기 때문에 유효한 심볼릭 링크를 생성하려면(또는 심볼릭 링크 대상에서 적절한 수의 접두사를 사용하려면) 명령 for
의 루프에 전체 경로를 제공해야 한다는 것을 방금 알아차렸습니다. 다른 시작 디렉터리를 사용하는 경우를 대비하여 귀하의 디렉터리 를 로 바꾸었습니다 .ln
../
find ~
$HOME/Coding
답변2
목표 js_books/'{}'
는 js_books
. 디렉토리인 경우왜냐하면원본 파일과 동일한 이름을 사용하면 됩니다.
여기서 문제는 {}가 상위 디렉터리 이름을 추가하여 기능을 손상시킬 가능성이 가장 높습니다.
답변3
한 가지 방법은 다음을 수행하는 것입니다.
find ~ -type f -iregex '.*javascript.*\.pdf' -printf %f"*"%h | awk -F* '{ system("ln -s "$2"/"$1" "$2"/js_books/"$1) }'
find 명령을 실행하고 파일 이름, 별표, 디렉터리 경로를 차례로 인쇄합니다. awk를 통해 실행하고 파일 이름과 디렉터리를 분리한 다음 awk의 시스템 기능을 사용하여 실행될 ln 명령을 빌드합니다.
이는 명령 주입이 가능하며 시스템을 사용하여 최종 명령을 실행하기 전에 print를 사용하여 명령을 화면에 인쇄할 수도 있습니다.