내 디렉토리에 3개의 zip 파일이 있습니다. 최신 버전을 백업 디렉터리에 복사하고 싶습니다.
내 코드는 .sh
및 다른 파일에서는 작동하지만 에서는 .zip
작동하지 않습니다.
cp -p `ls -tr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/| tail -1` /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/
그것은 말한다:cp: website3.zip: No such file or directory
답변1
이것을 실행하세요:
cp -p "`ls -dtr1 "$SRC_DIR"/* | tail -1`" "$DEST_DIR"
여기서는 ls -d
절대 경로가 제공됩니다.
명령에서는 ls
절대 경로가 반환되지 않으므로 파일을 복사하려면 소스 디렉터리에서 명령을 실행해야 합니다. 파일이 없는 다른 디렉터리에서 실행하면 No such file or directory
오류가 나타납니다.
또한 경로에 공백이 있으므로 ls -dtr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/* | tail -1
셸이 출력을 토큰화하지 않도록 이를 인용해야 합니다.
답변2
다른 사람들이 이미 지적했듯이 귀하의 접근 방식에는 두 가지 문제가 있습니다. .zip
vs 파일과는 아무런 관련이 없지만 파일 .sh
의 이름과 위치와 관련이 있습니다.
명령 대체에는 큰따옴표를 넣어야 합니다. 그렇지 않으면 공백 문자에서 중단됩니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?자세한 내용은.
또한 이 ls
명령은 디렉터리 부분이 아닌 파일의 기본 이름만 출력합니다. cp
따라서 기본 이름만 표시되며 다른 디렉터리에 있는 파일을 참조하고 있는지는 알 수 없습니다. 이 문제를 해결하는 한 가지 방법은 먼저 원하는 디렉터리로 변경하는 것입니다.
cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p -- "`ls -tr | tail -n1`" ../Backup1/
최신 파일(무엇이든)이 아닌 최신 zip 파일만 원하는 경우:
cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p -- "`ls -dtr -- *.zip | tail -n1`" ../Backup1/
디렉토리가 비어 있거나 파일 이름에 현재 로케일에서 인쇄할 수 없는 문자나 개행 문자가 포함되어 있으면 이상한 오류 메시지와 함께 이 작업이 실패하지만 이러한 경우는 비교적 드뭅니다.
이 옵션은 이름이 일치하는 하위 디렉터리가 있는 경우 -d
약간의 추가 보안을 제공합니다 *.zip
. 이 옵션은 필요하지 않습니다 -1
. ls
출력이 다른 명령으로 리디렉션되면 해당 효과가 자동으로 적용됩니다.
또는 다음을 사용할 수 있습니다.다루기 힘든덕분에 모든 것이 멋지고 쉬워졌습니다.글로벌 예선.
cp -p /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/*(om[1]) /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/
답변3
이는 귀하가 수행하는 작업에 따라 달라지기 때문입니다 cp
. 귀하의 예에서는 에서 실행하는 경우 ls -tr1 /Users/Me/Whatever
에만 반환되고 파일을 찾으려고 시도합니다 .website3.zip
cp
/tmp
/tmp/website3.zip
전체 경로를 표시 하려면 ls
와일드카드 문자를 사용해야 합니다 *
. 필요에 따라 모든 하위 디렉터리의 내용을 나열 -d
하지 않는 옵션을 지정하는 것이 유용할 수 있습니다.ls
$ ls -tr1d /Users/Me/Whatever
...
website3.zip
$ ls -tr1d /Users/Me/Whatever/*
...
/Users/Me/Whatever/website3.zip
그러나 마지막으로 수정된 항목이 디렉터리인 경우에는 주의하세요. 이 경우 cp
이 -R
옵션을 생략하면 복사되지 않습니다.
파일에 항상 .zip
확장명이 있는 경우 다음을 고려할 수 있습니다.
$ ls -tr1d /Users/Me/Whatever/*.zip
디렉터리가 비어 있으면 오류 메시지가 나타날 수도 있습니다. 다음과 같은 스크립트를 작성해 보는 것은 어떨까요?
#!/bin/bash
MY_DIR="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Original/"
DEST="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Backup1/"
FILEEXT="zip"
NEWEST=`ls -tr1d "${MY_DIR}/"*.${FILEEXT} 2>/dev/null | tail -1`
if [ -z "${NEWEST}" ] ; then
echo "No file to copy"
exit 1
elif [ -d "${NEWEST}" ] ; then
echo "The most recent entry is a directory"
exit 1
else
echo "Copying ${NEWEST}"
cp -p "${NEWEST}" "${DEST}"
fi
답변4
cp -p $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) <DESTINATION>
ls -Art <SOURCE> | tail -1
디렉토리의 최신 파일을 제공합니다.$(find `pwd` -name `ls -Art <SOURCE> | tail -1`)
최신 파일의 절대 파일을 제공합니다.cp -p $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) <DESTINATION>
소스에서 타겟으로 파일을 복사하세요!