저는 Oracle Solaris를 사용하고 있습니다.
나는 다음을 사용하고 있습니다 :
grep "searchstring" filename.*
위 명령은 내 검색 결과를 반환합니다.
이제 위 검색 결과의 모든 파일(검색 결과의 모든 파일이 아님)을 특정 디렉터리로 이동하고 싶습니다 ../mydir/
.
이 작업을 하나의 명령으로 어떻게 수행할 수 있습니까(검색과 이동 모두 한 줄 명령으로 수행해야 함).
답변1
ksh
, bash
또는 에서 /usr/xpg4/bin/sh
파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 ( grep -l
의 출력에 Split+glob 연산자를 사용할 수 있습니다.-l
나일치하는 파일입니다).
이 연산자는 떠나서 호출됩니다.명령 대체( `...`
또는 $(...)
) 따옴표 없이. 여기서는 특수 변수를 사용하여 $IFS
분할하려는 문자(여기서는 줄 바꿈)를 지정하고 해당 glob
부분을 다음과 같이 비활성화하도록 조정합니다 set -f
.
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(와일드카드를 복원합니다.~에확장을 위한 filename*
명령 대체(서브쉘에서 실행)
이를 다음과 같이 단순화할 수 있습니다.
mv $(grep -l searchstring filename*) ../mydir/
파일 이름에 공백, 탭, 줄 바꿈 *
또는 ?
문자가 포함되어 있지 않다는 것을 알고 있는 경우 [
. 위의 분할은 줄 바꿈, 공백 및 탭(기본값 $IFS
)에서 수행되며 분할 결과의 각 단어에 와일드카드를 수행합니다(그러나 파일 이름에 와일드카드가 포함되어 있지 않으면 문제가 되지 않습니다).
파일 이름에 개행 문자가 포함되어 있지 않다고 보장할 수 없는 경우 루프를 사용할 수 있습니다.
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done