명령을 찾고 grep 및 mv를 찾으십시오.

명령을 찾고 grep 및 mv를 찾으십시오.

내 SRC 폴더에 많은 파일이 있습니다. 특정 패턴을 따르는 모든 파일을 이 SRC 폴더에서 다른 DST 폴더로 이동하고 파일 이름을 원하는 확장자로 바꾸고 싶습니다.

예시 매개변수

SRC 디렉토리/Vinodh

폴더의 파일 /Vinodh에는 TEST01, TEST02, TEST03,TEST04

TEST02& TEST03단어 포함WORLD

일광 절약 시간 디렉토리/TEST

TEST02& TEST03파일을 /TEST폴더로 이동 하고 싶습니다 TEST02.txt.TEST03.txt

다음과 같이 명령을 입력하겠습니다.

cd /Vinodh
grep -l 'WORLD' *TEST*
mv TEST02 /TEST
mv TEST03 /TEST
cd /TEST
mv TEST02 TEST02.txt
mv TEST03 TEST03.txt

이 모든 내용을 한 줄의 명령문으로 결합하거나 배치 파일을 사용하여 모든 파일을 한 번에 복사하고 싶습니다.

답변1

GNU 도구 사용:

grep -D skip -d skip -lZ WORD /Vinodh/*TEST* | xargs -r0 mv -vt /TEST

이러한 파일 중 일부가 심볼릭 링크인 경우 해당 파일을 이동하면 링크가 끊어질 수 있습니다.

GNU는 grep장치/fifos 건너뛰기를 사용할 수 있고 -D skip디렉터리 건너뛰기를 사용할 수 있지만 -d skip심볼릭 링크를 건너뛸 수 있는 옵션은 없습니다. glob이 파일 유형을 지정할 수 있는 쉘이 필요합니다 zsh. 예를 들면 다음과 같습니다.

grep -lZ WORD /Vinodh/*TEST*(.) | xargs -r0 mv -vt /TEST

그냥 봐정기적인문서.

또 다른 방법은 다음을 사용하는 것입니다 find.

LC_ALL=C find /Vinodh/. ! -name . -prune \
  ! -name '.*' -type f -name '*TEST*' -exec grep -lZ WORD {} + |
  xargs -r0 mv -t /TEST

GNU 도구가 없는 경우 POSIX 변형이 있습니다.

LC_ALL=C find /Vinodh/. ! -name . -prune \
  ! -name '.*' -type f -name '*TEST*' -exec grep -q {} \; \
  -exec mv {} /TEST/ \;

답변2

루프 파일을 사용한 for f...다음 mv조건부로 래핑합니다(예:테스트 및 조건BashGuide에서):

cd /Vinodh
for f in *TEST* ; do
    if grep -q WORLD "$f" ; then
        mv "$f" "/TEST/$f.txt"
    fi
done

답변3

쉘이 Bash라고 가정합니다.

source_directory='/Vinodh'
destination_directory='/TEST'
for file in "$source_directory/"*; do
  renamed_file="$(basename "$file")"
  if grep -q 'WORLD' "$file"; then
    echo "Moving \"$file\" to \"$destination_directory/${renamed_file%.*}.txt\""
    mv "$file" "$destination_directory/${renamed_file%.*}.txt"
  fi
done
  1. 반복의 모든 파일 $source_directory.
  2. 파일 이름(마지막 이름 뒤의 부분 /)을 추출합니다.
  3. WORLD파일에서 문자열을 찾으세요. grep -q즉, 종료 코드만 설정하고 수행한 내용은 인쇄하지 않습니다.
  4. $destination_directory파일 에서 문자열이 발견되면 .txt.

답변4

grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh

관련 정보