Linux

文件複製到目錄時自動執行命令

  • February 24, 2015

我有兩個名為:A 和 B 的文件夾,位於同一台電腦上的不同路徑中。當我將任何新文件添加到文件夾 A 時,我想將其自動複製到文件夾 B。

我的文件夾:

/auto/std1/nat1/A
/auto/std2/nat2/B

我目前複製文件的操作:

cp -r A B

但我希望這個過程在後台自動執行,每個新文件和文件夾A進入B.

添加的問題/問題

在復製文件時,我希望對某些文件類型執行特定操作,例如:當我zip在文件夾中有一個文件時A,我希望它自動複製到unzip文件夾中的這個文件B

這是在 CentOS 7` 系統上。

rsync根據您的額外問題,在我在下面提供的 shell 腳本中的命令下方添加以下行。我在評論中寫了這個,但我會在這裡正式將它添加到我的答案中:

   find /auto/std2/nat2/B -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

rsync這將處理解壓縮通過從文件夾複製/auto/std2/nat2/A到的所有 zip 文件/auto/std2/nat2/B


如果你已經rsync安裝了為什麼不直接 cron 它並rsync管理文件鏡像呢?

創建腳本myrsyncscript.sh

不要忘記使其可執行:chmod 700 myrsyncscript.sh

#!/bin/sh

LOCKFILE=/tmp/.hiddenrsync.lock

if [ -e $LOCKFILE ]
       then
       echo "Lockfile exists, process currently running."
       echo "If no processes exist, remove $LOCKFILE to clear."
       echo "Exiting..."
#        mailx -s "Rsync Lock - Lock File found" myemail@domain.com <<+
#Lockfile exists, process currently running.
#If no processes exist, remove $LOCKFILE to clear.
#+
       exit
fi

touch $LOCKFILE
timestamp=`date +%Y-%m-%d::%H:%M:%s`
echo "Process started at: $timestamp" >> $LOCKFILE

## Run Rsync if no Lockfile
rsync -a --no-compress /auto/std1/nat1/A /auto/std2/nat2/B


echo "Task Finished, removing lock file now at `date +%Y-%m-%d::%H:%M:%s`"
rm $LOCKFILE

選項細分:

-a is for archive, which preserves ownership, permissions etc.
--no-compress as there's no lack of bandwidth between local devices

您可能會考慮的其他選項man rsync

–忽略現有

跳過更新接收器上存在的文件

  • 更新

這會強制 rsync 跳過目標上存在的任何文件,並且修改時間比源文件新。(如果現有目標文件的修改時間等於源文件的修改時間,則如果大小不同,它將被更新。)請注意,這不會影響符號連結或其他特殊文件的複制。此外,無論對像上的日期是什麼,發送者和接收者之間的文件格式差異始終被認為對更新來說足夠重要。換句話說,如果源有一個目錄,目標有一個文件,那麼無論時間戳如何,都會發生傳輸。

此選項是傳輸規則,而不是排除規則,因此它不會影響進入文件列表的數據,因此也不會影響刪除。它只是限制接收方請求傳輸的文件。

像這樣將它添加到 cron 中,並將頻率設置為您覺得最舒服的頻率:

打開 croncrontab -e並添加以下內容:

### Every 5 minutes
*/5 * * * * /path/to/my/script/myrsyncscript.sh > /path/to/my/logfile 2>&1 

# * * * * *  command to execute
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
# │ │ │ └────────── month (1 - 12)
# │ │ └─────────────── day of month (1 - 31)
# │ └──────────────────── hour (0 - 23)
# └───────────────────────── min (0 - 59)

引用自:https://unix.stackexchange.com/questions/186399