내 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
- 반복의 모든 파일
$source_directory
. - 파일 이름(마지막 이름 뒤의 부분
/
)을 추출합니다. WORLD
파일에서 문자열을 찾으세요.grep -q
예큐즉, 종료 코드만 설정하고 수행한 내용은 인쇄하지 않습니다.$destination_directory
파일 에서 문자열이 발견되면.txt
.
답변4
grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh