한 폴더에서 다른 폴더로 일부 파일을 이동해야 하는데 이는 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 서브쉘로 전달하는 동작은 버전 '{}'
에 따라 다릅니다 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