修改具有相同文件夹名称的多个文件

时间:2017-10-04 02:00:22

标签: bash

在不使用'重命名'的情况下,大量重命名与文件夹名称相同的文件时需要帮助CMD

e.g。

/archive/2017-09-22_cyber.gz
/archive/2017-09-23_cyber.gz
/archive/2017-09-24_cyber.tar

...........

上述文件必须复制并重命名为文件夹名称并保留在/ tmp / archive中。复制后应重命名,不要影响原始文件

如下所示

<ul class="post-title">
<li><span style="float:left">the date</span> - this is the text. this is the text. this is the text.  
</ul>

2 个答案:

答案 0 :(得分:0)

ls /tmp/*/* | sed 's/\/tmp\/\([^/]*\)\/\(.*\)/mv & \/tmp\/archive\/\1_\2/' > temp.sh

source temp.sh

答案 1 :(得分:0)

Bash本身可以使用内置参数扩展和子串删除来完成您尝试做的事情,而无需调用其他子shell调用外部实用程序。

Bash提供了两种基本形式的参数扩展和子字符串删除(实际上是四种,如果你算上做同样的事情,最短和最长的独立)

${string#substring}     Strip shortest match of $substring from front of $string
${string##substring}    Strip longest match of $substring from front of $string

${string%substring}     Strip shortest match of $substring from back of $string
${string%%substring}    Strip longest match of $substring from back of $string

例如,如果我有fullfilename=/path/to/my/file.txt且我只想file.txt,我可以使用filename="${fullfilename##*/}"“从{{1}前面删除"*/"的最长匹配(例如,所有内容,包括最后一个$fullfilename,将'/'留在变量file.txt中)

您可以使用filename来收集find以下的所有文件来解决您的问题,然后重新编写文件名,以正确的名称将它们放在tmp中,连续3个应用程序,例如

(我对/archive使用ffnfullfilename使用f,完整目录路径使用filename,最后一个目录使用d成分):

last

(将while read -r ffn; do f="${ffn##*/}" d="${ffn%/"$f"}" last="${d##*/}" echo "cp -a $ffn /archive/${last}_$f" ## just showing what would be done ## cp -a "$ffn" /archive/"${last}_$f" ## uncomment to actually copy done < <(find tmp/ -type f) 添加到-ua选项,仅复制cp中的新文件或已更改文件

目录内容示例

tmp

示例使用/输出

作为带有换行符的单行内容,以便于阅读:

$ tree tmp
tmp
├── 2017-09-22
│   └── cyber.gz
├── 2017-09-23
│   └── cyber.gz
└── 2017-09-24
    └── cyber.tar

(为了清晰起见,在使用$ while read -r ffn; do f="${ffn##*/}"; d="${ffn%/"$f"}"; last="${d##*/}"; \ echo -e "\ncp -a $ffn /archive/${last}_$f"; done < <(find tmp/ -type f) cp -a tmp/2017-09-23/cyber.gz /archive/2017-09-23_cyber.gz cp -a tmp/2017-09-22/cyber.gz /archive/2017-09-22_cyber.gz cp -a tmp/2017-09-24/cyber.tar /archive/2017-09-24_cyber.tar 输出之前添加了换行符)

仔细看看,如果您有其他问题,请告诉我。