查找:路径必须在表达式之前:'%u'

问题描述 投票:-1回答:1

我正在使用Ubuntu和bash。

我正在寻找有关我做错事情的提示。我有一个脚本,该脚本使用find命令监视/ home / *目录树。 (有人告诉我statinotify,但不想走这些路。)我发现find在bash的CLI上的工作方式以及在bash的工作方式上有区别脚本。我99%确信这与我在脚本中使用单引号和双引号以及在脚本内部执行命令的交互方式有关。

该脚本接受有关这些JPG应该进入的源目录和目标目录的命令行参数。其他有效的args用于排序顺序,计数,调试等。对于我的问题,其中的大部分并不重要。我提供它作为上下文。

使用命令行参数来帮助构建$ findcmd变量,然后作为命令执行该变量的内容。

我在CLI上对find命令建模,以确保输出正确。用单引号可以很好地工作:

find /home -type f -name '*.jpg' -printf '%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n'

它在双引号中也很好用:

find /home -type f -name "*.jpg" -printf "%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n"

两者的输出如下:

/home/wls1/1800WLS610Entry_20191104072738420_YDF1597.jpg wls1 2019-11-04 13:27:41
/home/wls1/1800WLS610Entry_20191108074131850_CL3532.jpg wls1 2019-11-08 13:41:34
/home/wls1/1800WLS610Entry_20191028164226820_C0NTRACT.jpg wls1 2019-10-28 21:42:29
/home/wls1/1800WLS610Entry_20191030080258580_DH8J657.jpg wls1 2019-10-30 13:03:00
/home/wls1/1800WLS610Entry_20191028081121920_C0NTRACT.jpg wls1 2019-10-28 13:11:24
/home/wls1/1800WLS610Entry_20191029092243320_CG1645.jpg wls1 2019-10-29 14:22:44
/home/wls1/1800WLS610Entry_20191107075811250_MDH0612.jpg wls1 2019-11-07 13:58:14
/home/wls1/1800WLS610Entry_20191024092804130_987UYJ.jpg wls1 2019-10-24 14:28:07
/home/wls1/1800WLS610Entry_20191106072723570_KNC0315.jpg wls1 2019-11-06 13:27:25
/home/wls1/1800WLS610Entry_20191108070231370_MPP4025.jpg wls1 2019-11-08 13:02:32
/home/wls1/1800WLS610Entry_20191107052855050_KPC6751.jpg wls1 2019-11-07 11:28:58
/home/wls1/1800WLS610Entry_20191024123751720_KCH4678.jpg wls1 2019-10-24 17:37:54
/home/wls1/1800WLS610Entry_20191027092846650_C0NTRACT.jpg wls1 2019-10-27 14:28:52
/home/wls1/1800WLS610Entry_20191028131352340_C0NTRACT.jpg wls1 2019-10-28 18:13:55
/home/wls1/1800WLS610Entry_20191030122055760_BHG2686.jpg wls1 2019-10-30 17:20:57
/home/wls1/1800WLS610Entry_20191029102259860_0W07001.jpg wls1 2019-10-29 15:23:02

在我的脚本中,这不太好用:它产生提到的错误。 (我还假设变量$ sourcedir,$ sortby,$ excludedir和$ destdir是正确的)

...
        findcmd="find $sourcedir -name '*.jpg' -type f -printf '%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n'"
...
        echo "Find CMD          = ${findcmd}"
...
        if [ "$sortby" == "youngest" ]; then
            rawresults="$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --reverse --key=3,4 > delete.me.txt)"
        else
            rawresults="$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --key=3,4 > delete.me.txt)"
        fi

输出为:

Find CMD          = find /home -name '*.jpg' -type f -printf '%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n'
find: paths must precede expression: `%u'

并且delete.me.txt为空。

我也尝试过这些变体。

        findcmd='find $sourcedir -name "*.jpg" -type f -printf "%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n"'
...
        echo "Find CMD          = ${findcmd}"
...
        if [ "$sortby" == "youngest" ]; then
#           rawresults="$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --reverse --key=3,4 > delete.me.txt)"
            rawresults=$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --reverse --key=3,4 > delete.me.txt)
        else
#           rawresults="$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --key=3,4 > delete.me.txt)"
            rawresults=$($findcmd | grep -v $excludedir | grep -v $destdir | sort --stable --key=3,4 > delete.me.txt)
        fi

这将产生基本相同的输出:

Find CMD          = find $sourcedir -name "*.jpg" -type f -printf "%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n"
find: paths must precede expression: `%u'

我认为在从bash脚本内部执行CLI命令的上下文中,双引号和单引号如何工作缺少一些基本知识。

和/或我可能没有正确理解的var="$($command_str)"的结构。

提前感谢您的帮助!

bash scripting double-quotes single-quotes
1个回答
0
投票

尝试使用'*.jpg'单引号并在路径的末尾加上/末尾。

findcmd='find /home/ -name '*.jpg' -type f -printf "%p %u %TY-%Tm-%Td %TH:%TM:%.2TS\n"'
© www.soinside.com 2019 - 2024. All rights reserved.