在crontab上运行的Shell脚本的问题\ n不起作用

时间:2019-06-29 12:30:32

标签: bash shell cron

我正在执行cron作业,以根据需要检查和恢复方舟文件。我需要获得.ark文件的最大文件大小,如果.TheIsland.ark文件较小,它将自动备份并复制到最大大小。现在,当我在crontab进行此操作时,脚本的一部分会失败。

哪个是:

actualmap=$(find $PWD -type f -printf '%p\n' -name "*.ark"| sort -nr | head -1)

如果我删除\ n,它实际上可以工作,但是由于它们不在单独的行中,因此无法在它们之间进行排序。

我在\ n进行cron作业的输出是:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/recovery.sh (which is the recovery script)

在终端中运行的同一行代码会产生以下正确输出:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_NewLaunchBackup.bak

没有使用crontab的\ n,我得到:

/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_27.06.2019_21.46.20.ark/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/TheIsland_28.06.2019_15.15.34.ark

我已经附上了可以手动运行的完整代码。

#!/bin/bash
export DISPLAY=:0.0

##ARK Map Recovery Script
cd /srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks

#Check file size of current ark map
file=TheIsland.ark
echo $file
currentsize=$(wc -c <"$file")
echo $currentsize

#Find biggest map file.
actualmap=$(find $PWD -type f -printf '%p\n' -name "*.ark"| sort -nr | head -1)>/srv/daemon-data/da4aaa1b-0ce9-46d2-bd60-5f599cc089ae/ShooterGame/Saved/SavedArks/log.txt
echo $PWD
echo $actualmap
biggestsize=$(wc -c < "$actualmap")
echo $biggestsize

if [ $currentsize -ge $biggestsize ]; then
    echo No map recovery required as over $biggestsize bytes
else
    echo Uh Oh! size is under $biggestsize bytes Attempting map recovery
    echo Checking for Backup dir and creating if necessary
    mkdir -p BackupFiles

    #Move old map into backup dir in the saved location
    echo Moving old Map File to backup dir
    mv $file BackupFiles

    #Stop server using docker commands
    echo Stopping servers

    docker kill da4aaa1b-0ce9-46d2-bd60-5f599cc089ae
    #Copy biggest map file with correct name
    echo Copying backup file
    cp $actualmap $file
fi  

1 个答案:

答案 0 :(得分:1)

此处不需要在-printf命令中使用find选项。 -print就可以了。

我通过以下方法获得所需的结果(发现返回找到的文件名,每行一个):

find $PWD -type f -name "*.ark" -print. 

通过-printf%p始终为您提供文件名。

来自man find:-print True; 在标准输出上打印完整的文件名,然后换行

选项-print已完成您想要的操作。