あるディレクトリから別のディレクトリに最新のファイルをコピーするには?

あるディレクトリから別のディレクトリに最新のファイルをコピーするには?

私のディレクトリには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

他の人がすでに指摘したように、あなたのアプローチには2つの問題があります。.zipvsファイルとは関係ありませんが、ファイル.shの名前と場所に関連しています。

コマンドの置き換えには二重引用符を入れる必要があります。それ以外の場合は空白文字で中断されます。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細については。

このlsコマンドは、ディレクトリ部分ではなくファイルのデフォルト名のみを出力します。cpしたがって、デフォルト名のみが表示され、別のディレクトリにあるファイルを参照しているかどうかはわかりません。この問題を解決する1つの方法は、まず目的のディレクトリに変更することです。

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。このオプションは必要ありません-1ls出力が別のコマンドにリダイレクトされると、その効果は自動的に適用されます。

または、次のものを使用できます。扱いにくいおかげで、すべてが素敵で簡単になりました。グローバル予選

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> ソースからターゲットにファイルをコピー!

関連情報