在不使用'重命名'的情况下,大量重命名与文件夹名称相同的文件时需要帮助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>
答案 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
使用ffn
,fullfilename
使用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
输出之前添加了换行符)
仔细看看,如果您有其他问题,请告诉我。