首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何接受命令行上的文件列表并使用xargs创建所有文件的日期副本(basename_date.extension)?

如何接受命令行上的文件列表并使用xargs创建所有文件的日期副本(basename_date.extension)?
EN

Unix & Linux用户
提问于 2021-03-12 01:00:47
回答 1查看 592关注 0票数 0

我花了相当多的时间从这里中解决这个问题,并且在不依赖xargs调用bash的情况下,我成功地获得了正确的输出(本教程还没有讨论这个问题)。需要很长时间才能正确引用xargs中的子D3调用,出于某种原因,我不得不将replace-str保存在变量中,并重新计算date并将其保存在一个新变量中,因为:

编辑:我知道rename也可以用来解决这个问题,但是我所链接的教程中还没有提到这一点,而不是这个练习的重点(正如前面提到的,就是使用xargs)。

  • 显然,param展开不适用于replace-str = {},因此我不能执行“{}%.*”并获得文件扩展名。
  • 显然,即使是双引号变量today,如果在xargs命令中运行的子bash进程中使用,也将为null。
代码语言:javascript
复制
    # % 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##*.}"'

威尔输出

代码语言:javascript
复制
    s1_2021-03-11.bash s2_2021-03-11.bash 

论输入

代码语言:javascript
复制
    ./myscript s1.bash s2.bash

编辑:重申输入如下所示

代码语言:javascript
复制
    ./myscript file1.ext file2.ext file3.ext ... fileN.ext

在运行ls之后,应该存在如下所示的文件

代码语言:javascript
复制
    file1_yyyy-mm-dd.ext ... fileN_yyyy-mm-dd.ext

如果可能的话,我宁愿找一个不使用bash -c的解决方案,因为网站上的教程还没有涉及到这一点,所以我怀疑它是否能解决这个问题。我还想了解我对param展开、不使用xargs和需要另一个日期变量的困惑。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-03-12 06:47:15

如果我们无法访问GNU版本的xargs/sed,那么我们需要为xargs安全地引用文件名。

用法:

代码语言:javascript
复制
 ./myscript   your list of files goes here
代码语言:javascript
复制
#!/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版本的实用程序。

代码语言:javascript
复制
#!/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 --

备注:

  • 对于不能从xargs替换字符串{} is bcoz {}获得扩展名,您的混淆只是一个占位符,可以提醒xargs用参数替换它。因此,在解析xargs命令时,shell看不到它。
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/638864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档