파일 이름만 사용하여 이동

파일 이름만 사용하여 이동

한 폴더에서 다른 폴더로 일부 파일을 이동해야 하는데 이는 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수 있습니다 .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

관련 정보