![exec를 사용한 찾기 및 복사가 작동하지 않습니다.](https://linux55.com/image/146552/exec%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EC%B0%BE%EA%B8%B0%20%EB%B0%8F%20%EB%B3%B5%EC%82%AC%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음 명령을 사용하여 디렉토리의 최신 파일을 가져옵니다.
/usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/"
이는 전체 경로가 아닌 파일 이름만 반환합니다.
그런 다음 찾은 파일을 다른 폴더에 복사하고 싶어서 이전 find 명령에 다음을 추가했습니다.
-exec cp {} /home/user2/folder2 \;
따라서 전체 명령은 다음과 같습니다.
/usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/ -exec cp {} /home/user2/folder2 \;
하지만 이것은 반환
cut: invalid option -- 'e'
내가 여기서 뭘 잘못하고 있는 걸까?
답변1
귀하의 명령에는 두 가지 문제가 있는 것 같습니다. 그 중 첫 번째는 귀하의 경우에는 중요하지 않을 수 있지만 여전히 지적할 가치가 있습니다.(나)\n
임의의 파일 이름, 특히 개행 문자가 포함된 파일 이름(예: )을 처리할 수 없기 때문에 보편적이지 않습니다.(둘)Kusalananda가 이미 지적했듯이 -exec
옵션은 명령에 속하므로 find
여러분이 하려는 것처럼 옵션과 분리할 수 없습니다.
GNU 유틸리티를 사용하면 다음 파이프라인으로 이러한 문제를 해결할 수 있습니다. 이 파이프라인은 디렉터리(또는 아래)에서 최신 파일을 찾아 다음 /home/user1/folder1/
위치에 복사합니다 /home/user2/folder2/
.
find /home/user1/folder1/ -type f -printf '%T@ %p\0' 2>/dev/null |
sort -znk1,1 | tail -zn1 | cut -zf2- -d' ' |
xargs -0 cp -t /home/user2/folder2/
문제에 관해서는(나): 형식 문자열 \0
끝에 있는 및 옵션 -printf
과 파이프라인의 다양한 명령 에 유의하세요 -z
. 이 명령은 인식된 파일 이름이 NUL로 구분되어 전달되어 공백 및/또는 줄 바꿈을 포함할 수 있도록 합니다.-0
문제에 관해서는(둘): 이 xargs
명령을 사용하여 매개변수를 수집 stdin
하고 이를 사용하여 새 명령줄을 작성할 수 있습니다. 여기서 비결 중 하나는 복사할 파일 이름을 제공하기 전에 명령 -t
의 옵션을 사용하여 cp
대상 디렉터리를 지정하는 것입니다. 왜냐하면 xargs
명령줄은 다음을 통해 구성되기 때문입니다.추가stdin
주어진 명령에 대해 수신하는 모든 인수입니다.
답변2
쉘을 사용하여 zsh
가장 최근에 수정된 파일을 디렉토리에 복사한다고 가정합니다 /home/user1/folder1
.
cp /home/user1/folder1/*(.om[1]) /home/user2/folder2
zsh
대화형 쉘이 아닌 경우 다음을 수행할 수 있습니다 .
zsh -c 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'
패턴은 /home/user1/folder1/*(.om[1])
지정된 디렉터리에서 가장 최근에 수정된 일반 파일의 이름으로 확장됩니다. *(.om[1])
마지막으로 o
일반 파일( )을 수정 시간( )별로 정렬하고 첫 번째 파일( )을 선택하는 것입니다..
m
[1]
숨겨진 파일 이름을 일치시켜야 하는 경우 다음을 사용하십시오.
zsh -c -4 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'
(에 추가 -4
)
하위 디렉터리를 추가로 보려면 다음을 사용하세요.
zsh -c -4 'cp /home/user1/folder1/**/*(.om[1]) /home/user2/folder2'
쉘 와일드카드 패턴은 **
경로명에서 zsh
일치합니다 /
.