我在R中编写了一个包含多个参数的脚本。我想遍历20个目录并在每个目录上执行我的脚本,同时使用sed从文件路径中将子字符串作为我的-n参数传递。我运行了以下内容:
find . -name 'xray_data' -exec sh -c 'Rscript /Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;
导致此错误:
ubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;
sh: command substitution: line 0: syntax error near unexpected token `('
sh: command substitution: line 0: `sed -e s/.*DeMMO.*[/](.*)_.*[/]xray_data/1/ "./DeMMO1/D1T3rep_Dec2019_Ellison/xray_data"'
当我尝试在示例文件路径上将sed与我的模式一起使用时,它将起作用:
echo "./DeMMO1/D1T1exp_Dec2019_Poorman/xray_data" | sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/'
产生正确的子字符串:
D1T1exp_Dec2019
我认为尝试在解释的字符串中使用单引号存在问题,但我不知道如何处理。我尝试用双引号替换sed模式周围的单引号,以及删除单引号,两者均导致此错误:
sed: RE error: illegal byte sequence
在这种情况下,我应该如何从文件路径中动态提取子字符串?
循环遍历find的输出。
while IFS= read -ru "$fd" -d '' files; do
echo "$files" ##: do whatever you want to do with the files here.
done {fd}< <(find . -name 'xray_data' -print0)
引号中没有嵌入的命令。
它使用一个随机的fd
,以防循环内的某些东西吞噬/吸食stdin
也-print0
用null
字节分隔文件,因此它应该足够安全以处理路径和文件名上的空格和换行符。
[一个好的开始总是总是在要处理文件的每个命令前面都加一个echo
,这样您就知道什么情况下将要执行/发生……