2013-12-16 7 views
1

이름에 특정 텍스트가 들어있는 모든 .fits 파일을 검색 한 다음 디렉토리에 복사하려고합니다. fetchKeys -t 'foo' -F | grep .fits파일 목록을 디렉토리에 복사

이 '갑'가 포함 .fits 파일의 목록을 반환

나는 'foo는'명령은 다음과 같습니다

말 들어있는 파일을 나열하는 명령을 호출 fetchKeys를 사용할 수 있습니다. 큰! 이제이 모든 것을 디렉토리 /path/to/dir에 복사하고 싶습니다. 개별적으로 할 수있는 파일이 너무 많습니다. 하나의 명령을 사용하여 파일을 모두 복사해야합니다.

내가 좋아하는 뭔가를 생각하고 있어요 :

fetchKeys -t 'foo' -F | grep .fits > /path/to/dir 

또는

cp fetchKeys -t 'foo' -F | grep .fits /path/to/dir 

하지만 과정도이 작품의

. 다른 아이디어?

답변

1

xargs 도구는 stdin에서 가져 오는 모든 행에 대해 명령을 실행할 수 있습니다. 그 매개 변수화 정말 사소한 것은 아니지만,

fetchkeys -t 'foo' -F | grep .fits | xargs -P 1 -n 500 --replace='{}' cp -vfa '{}' /path/to/dir 

xargs는 매우 유용한 도구입니다 :이 시간, 우리는 cp 명령을 실행합니다. 이 명령은 500 개의 .fits 파일을 읽고 모든 그룹에 대해 단일 cp 명령을 호출합니다. 나는 그것을 깊이 시험하지 않았고, 가지 않으면 당신의 의견을 기다리고 있습니다.

+0

답장을 보내 주셔서 감사합니다. 죄송합니다. 두 개의 '{}'에 무엇을 넣을까요? 나는/path/to/dir을 그들 중 하나에 넣을 것이라고 가정한다. 또한 916 개의 파일을 복사 할 수 있습니다. 감사 . – Derek

+0

아무것도 입력하지 않아도됩니다. – peterh

+0

안녕하세요. 죄송합니다. 오른쪽으로 스크롤하지 않았으므로/path/to/dir을 보지 못했습니다. Ok 명령을 실행했는데 지금 실행 중입니다. 그래도 시간이 걸릴 것 같아서 끝나면 알려 드리겠습니다. 또한 시간이 있다면 다른 서버에 파일을 복사하는 방법이 있는지 알고 계십니까? scp fetchKeys -t 'foo'| grep .fits [email protected] :/path/to/dir? 다시 한 번 감사드립니다. – Derek

3

Linux/Unix의 경우 find 명령을 사용할 수 있습니까? 그것은 fetchkeys과 매우 비슷합니다.

$ find . -name "*foo*.fit" -type f -print0 | while read -r -d $'\0' file 
do 
    basename=$(basename $file) 
    cp "$file" "$fits_dir/$basename" 
done 

find 명령은 이름에 *foo*.fits 일치하는 모든 파일을 찾을 수 있습니다. -type f은 디렉토리가 아니라 파일이어야한다고 말합니다. -print0은 발견 된 파일을 인쇄하지만 NUL 문자로 구분합니다. 일반적으로 find 명령은 각 행에 파일을 반환하지만 파일 이름에 공백, 탭, 줄 바꿈 또는 다른 이상한 문자가 포함되어 있으면 어떻게됩니까?

-print0은 널 (\ 0)이있는 파일을 분리하며, read -d $'\0' file은 이러한 널 문자로 구분 된 각 파일을 읽는 것을 의미합니다. 파일은 공백이나 이상한 문자를 포함하지 않는 경우, 당신이 할 수 있습니다 :

$ find . -name "*foo*.fit" -type f | while read file 
do 
    basename=$(basename $file) 
    cp "$file" "$fits_dir/$basename" 
done 

기본적으로, 당신은 쉘 변수 file에 당신의 find 명령으로 찾은 각 파일을 읽습니다. 그런 다음 해당 파일을 $fits_dir 또는 원하는 위치로 복사 할 수 있습니다.

는 다시, 어쩌면 fetchKeys를 사용하는 이유가, 그리고 교체 할 수 있습니다 fetchKeysfind,하지만 난 그 fetchKeys 명령을 모른다.

+0

답장을 보내 주셔서 감사합니다. 네, 리눅스이고 ssh가이 fetchKeys 명령을 사용할 수있는 다른 서버에 로그온하고 있습니다. 나는 그것에 대해 많이 알지 못하고 '남자'가 없다. 죄송합니다. 실수를했습니다. 'foo'는 파일 이름에 존재하지 않습니다. 이것은 맞는 파일에서 어딘가에 선언 된 것으로 가정하는 객체의 이름입니다. 따라서 fetchKeys는 fits 파일 내에서 'foo'라는 이름의 모든 객체를 찾은 다음 grep을 사용하여 맞는 파일을 찾습니다. 그래서 여기서 찾을 수 없습니다. 복사 할 파일이 916 개 있습니다. 어떤 아이디어? – Derek

+0

당신은 그것을 사용할 수 있습니다'fetchKeys -t 'foo'-F | grep .fits'을 실행하고'while read' 명령에 파이프하십시오. 기본적으로 백업 할 위치에 복사 할 파일을 공급해야합니다. –

3

복사 특정 디렉토리에 foo를 포함하는 이름을 가진 모든 파일 : (xargs없이 용액)

find . -name "*foo*.fit" -type f -exec cp {} "/path/to/dir/" \; 

복사 자체가 특정 디렉토리에 foo 포함 된 모든 파일을 :

for f in `find . -type f -exec grep -l foo {} \;`; do cp "$f" /path/to/dir/; done 

find 명령 매우 유용한 인수가 있습니다. -exec, -print, -delete. 이들은 매우 견고하며 수동으로 파일 이름을 처리 할 필요가 없습니다. -exec의 구문은 -exec (what to do) \;입니다. 현재 처리중인 파일의 이름이 자리 표시 자 {} 대신 대체됩니다.

이러한 작업에 매우 유용한 다른 명령은 sedawk입니다.

+0

오, 죄송합니다. 실수로 파일 이름에 'foo'가 없으므로 파일 자체에 존재합니다. 그것은 객체의 이름입니다. 그래서이 fetchKeys 명령을 사용해야합니다. 나는 확실히이 파일들을 하나씩 찾아내는 데 사용할 수 없습니다. 다른 아이디어? 감사 . – Derek

+0

물론 이에 대한 해결책도 추가되었습니다. – osa