
저는 Oracle Solaris를 사용하고 있습니다.
나는 다음을 사용하고 있습니다 :
grep "searchstring" filename.*
위 명령은 내 검색 결과를 반환합니다.
이제 위 검색 결과의 모든 파일(검색 결과가 아닌 모든 파일)을 특정 디렉터리로 이동하고 싶습니다 ../mydir/
.
이 작업을 하나의 명령으로 어떻게 수행할 수 있습니까? 검색과 이동은 모두 한 줄 명령으로 수행되어야 합니다.
답변1
ksh
, bash
또는 에서 파일 이름에 줄 바꿈 문자가 포함되어 있지 않다고 가정하면 ( 의 /usr/xpg4/bin/sh
출력에 Split+glob 연산자를 사용할 수 있습니다.grep -l
-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