이동에만 파일 이름을 사용하십시오

이동에만 파일 이름을 사용하십시오

find 및 grep으로 설정된 기준에 따라 일부 파일을 한 폴더에서 다른 폴더로 이동해야 합니다. 파일을 옮기려고 하면 깨집니다.

실제로 시도하는 움직임은 다음과 같습니다.mv /somefolder/export//somefolder/storage/testfileOLD.txt

내가 기대했던 것은mv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt

내가 사용하는 명령은 다음과 같습니다.

find /somefolder/storage/ -type f -name "*OLD*" -newermt '2019-05-1' ! -newermt '2019-06-7' -exec grep -qiF 'closed' {} \; -exec mv {} /somefolder/export/{} \;

이미 시도했는데 -exec basename {}올바른 결과를 얻었지만 mv를 다음과 같이 수정하면

-exec echo {} /somefolder/export/$(basename {}) \;

작동하는지 확인하기 위해 여전히 /somefolder/export//somefolder/storage/testfileOLD.txt.

답변1

$(basename {})실패할 것입니다(더 나은: 빈 문자열이면 됩니다). 여기에서 호출된 하위 쉘은 파일 이름으로 확장되지 않습니다. {}이는 찾기에만 적용되며 명령이 생성하는 하위 쉘로 내보내지지 않습니다.

다음을 실행하여 테스트할 수 있습니다.

find -exec echo "this will be empty:" $(basename '{}') \;

작은 스크립트를 작성하는 것이 좋습니다.

#!/bin/bash
mv "$1" /somefolder/export/"$( basename ${1})"

명령 으로 실행하세요 find.

find /dir/ <specs> -exec grep -qiF 'closed' '{}' \; -exec bash script.sh '{}' \;

AFAIK 서브쉘로 전달하는 동작은 -version '{}'에 따라 다릅니다 find.

답변2

디렉토리 아래의 원래 구조를 유지하려면 대신에 를 /somefolder/somedir사용할 수 있습니다 .rsyncmv

테스트 설정:

/somefolder/storage/testfileOLD.txt
/somefolder/storage/subdir/fileOLD.txt

이동 후 예상 결과:

/somefolder/export/testfileOLD.txt
/somefolder/export/subdir/fileOLD.txt

명령:

# first, create a file list of relative paths (some arguments removed for simplicity)
$ find /somefolder/storage -type f -name "*OLD*" -printf '%P\n' > /tmp/filelist

# cat to illustrate its content
$ cat /tmp/filelist
subdir/fileOLD.txt
testfileOLD.txt

# then rsync using `--remove-source-files` to move the files 
$ rsync -av --remove-source-files --files-from=/tmp/filelist /somefolder/storage /somefolder/export

관련 정보