한 디렉토리에서 다른 디렉토리로 최신 파일을 복사하는 방법은 무엇입니까?

한 디렉토리에서 다른 디렉토리로 최신 파일을 복사하는 방법은 무엇입니까?

내 디렉토리에 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

다른 사람들이 이미 지적했듯이 귀하의 접근 방식에는 두 가지 문제가 있습니다. .zipvs 파일과는 아무런 관련이 없지만 파일 .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.zipcp/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>
  1. ls -Art <SOURCE> | tail -1 디렉토리의 최신 파일을 제공합니다.
  2. $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) 최신 파일의 절대 파일을 제공합니다.
  3. cp -p $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) <DESTINATION> 소스에서 타겟으로 파일을 복사하세요!

관련 정보