我花了相当多的时间从这里中解决这个问题,并且在不依赖xargs调用bash的情况下,我成功地获得了正确的输出(本教程还没有讨论这个问题)。需要很长时间才能正确引用xargs中的子D3调用,出于某种原因,我不得不将replace-str保存在变量中,并重新计算date并将其保存在一个新变量中,因为:
编辑:我知道rename也可以用来解决这个问题,但是我所链接的教程中还没有提到这一点,而不是这个练习的重点(正如前面提到的,就是使用xargs)。
replace-str = {},因此我不能执行“{}%.*”并获得文件扩展名。today,如果在xargs命令中运行的子bash进程中使用,也将为null。 # % come from 'man 3 strftime'
today=$( date "+%Y-%m-%d" )
# make prefix date copy
#ls "$@" | xargs -I ^ cp ^ "${today}_^"
#make suffix date copy
echo "$@" | sed "s; ;\n;g" | xargs -I {} \
bash -cs 'var="{}"; td=$( date "+%Y-%m-%d" ); \
echo "${var%%.*}_${td}.${var##*.}"'
#prints basename_.bash i.e. without date
echo "$@" | sed "s; ;\n;g" | xargs -I {} \
bash -cs 'var="{}"; \
echo "${var%%.*}_${today}.${var##*.}"'威尔输出
s1_2021-03-11.bash s2_2021-03-11.bash 论输入
./myscript s1.bash s2.bash编辑:重申输入如下所示
./myscript file1.ext file2.ext file3.ext ... fileN.ext在运行ls之后,应该存在如下所示的文件
file1_yyyy-mm-dd.ext ... fileN_yyyy-mm-dd.ext如果可能的话,我宁愿找一个不使用bash -c的解决方案,因为网站上的教程还没有涉及到这一点,所以我怀疑它是否能解决这个问题。我还想了解我对param展开、不使用xargs和需要另一个日期变量的困惑。
发布于 2021-03-12 06:47:15
如果我们无法访问GNU版本的xargs/sed,那么我们需要为xargs安全地引用文件名。
用法:
./myscript your list of files goes here#!/bin/bash
# user defined function: qXargs
# backslashes all chars special to xargs:
# SPC/TAB/NL/double quotes, single quotes, and backslash.
qXargs() {
printf '%s\n' "$1" |
sed \
-e "s:[\\'${IFS%?}\"]:\\\\&:g" \
-e '$!s:$:\\:' \
;
}
# loop over command-line arguments
# quote them to make xargs safe and
# break apart arg into head portion and
#'extension and slip in today's date
today=$(date +'%Y-%d-%m')
for arg
do
src=$(qXargs "$arg")
head=$(qXargs "${arg%.*}")
tail=$(qXargs "${arg##*.}")
printf '%s\n%s_%s.%s\n' \
"$src" \
"$head" "$today" "$tail" ;
done | xargs -n 2 -t mv -f --假设GNU版本的实用程序。
#!/bin/bash
### this is the ./myscript file
d=$(date +'%Y-%d-%m')
printf '%s\0' "$@" |
sed -Ez "p;s/(.*)(\..*)/\1$d\2/" |
xargs -r0 -n2 -t mv -f --备注:
https://unix.stackexchange.com/questions/638864
复制相似问题