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
사용할 수 있습니다 .rsync
mv
테스트 설정:
/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