2014-12-13 2 views
0

dupes.txt에는 확장명이없는 파일 문자열 목록이 있습니다 (확장명이없는 기본 이름을 비교하여 찾음). 그때 find 명령의 이름 옵션찾을 변수에 변수를 전달하는 방법은 무엇입니까?

files=`cat dupes.txt`; for f in "$files"; do find . -type f -name "$f"; done 

에 "$ f를"을 통과하기 위해 노력하고있어

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done 

하지만 아무 것도 반환하지 않습니다 :이 선을 반향 얻을 수 있습니다. 제안을 환영합니다. 즉, 텍스트 파일에서 패턴과 일치하는 모든 파일을 찾고 싶습니다.

나는

find . -type f | fgrep -f dupes.txt 

을 시도했지만이 dupes.txt에서 파일 문자열과 일치하는 파일에 대한 발견의 출력을 제한하지 않습니다.

나는 OS X의 bash 쉘에서 작업하고 있습니다.

답변

0

이 시도 :

files=$(cat dupes.txt) 
for f in $files; do find . -type f -name "${f}*"; done 
+0

, 당신은 -name 매개 변수에 와일드 카드를 지정해야합니다. –

+0

단어 분할을 이용하기 위해 $ files를 인용하지 않음 –

+0

'$ files'를 인용하지 않으면 코드가 경로명 확장의 대상이됩니다. –

3

이 잘못 :

files=`cat dupes.txt`; for f in "$files"; do echo "$f"; done 

당신이 "$files"을 인용하고 있으므로, 쉘은 공백에 변수를 분할 할 기회가 없습니다. 따라서 루프 내에서 "$f"은 파일의 전체 내용을 포함합니다.

while IFS= read -r f; do ...; done < dupes.txt 
# or 
mapfile -t files < dupes.txt; for f in "${files[@]}"; do ...; done 

중 하나가 여기에 패턴을 생성하는 복잡한 방법을 선택, 파일의 내용을 반복하려면,하지만 당신은 한 번만 find를 호출해야하고, 그 큰 승리입니다 : 즉

find_args=() 
while IFS= read -r file; do 
    find_args+=(-o -name "${file}*") 
done < dupes.txt 
find . -type f \("${find_args[@]:1}" \) 
+0

감사합니다. Glenn. 나는 이것을 시도 할 것이다. 나는 한 번 이상 전화를하고 싶지 않습니다. (필자는 'read line'스크립트를 사용하면서 그 사실을 알았습니다.) – sqldoug

0
while read i; do 
    find -type f -name "${i}*" 
done < dupes.txt 
+0

괄호는 필요하지 않습니다. 'while' 루프 자체는 입력 리다이렉션을 취할 수 있습니다. – chepner

+0

제거됨, 10x @chepner –

+0

감사합니다. 배울 것이 너무 많습니다! – sqldoug

관련 문제