假设我有一个包含以下文件的目录:
1.txt 2.txt 3.txt
我想复制这些并基本上粘贴到同一目录中,制作新文件,例如:
1.txt 1(1).txt 2.txt 2(1).txt 3.txt 3(1).txt
这比我想象的要难!这在 Windows 上似乎很简单,只需突出显示一堆文件,复制/粘贴,它就会创建相同的文件,但在名称中添加“复制”。
答案1
在普通的 Unix 风格中,你需要循环遍历文件:
for file in 1.txt 2.txt 3.txt; do cp -pi "$file" "${file%.*}(1).txt"; done
${file%.*}
从文件名中删除扩展名,然后(1).txt
添加数字并恢复扩展名。用于cp
提示目标是否已存在 ( -i
) 和保留权限 ( )的选项-p
。
大多数 Linux 系统都会提供该mmv
软件包;这让你可以简单地做
mcp '*.txt' '#1(1).txt'
这会将每个以 结尾的文件复制.txt
到一个新文件中,匹配第一个通配符 ( #1
) 并附加(1).txt
.括号在这里不需要转义,因为它们在引号内。
或者,如果您使用图形文件管理器,则可以执行与在 Windows 中完全相同的操作。
答案2
这在 Windows 上似乎微不足道,只需突出显示一堆文件
我认为在 Linux 中的各种 GUI 文件管理器中这也是微不足道的,但是你需要 shell 解决方案,对吧?这里是:
for F in *; do cp -p "$F" "${F%.*}\(1\).${F#*.}"; done
${F%.*}
提取文件名中点之前的部分,同时${F#*.}
提取扩展名。
答案3
set ./*.txt
while [ -e "$1" ] || [ -L "$1" ]
do case ${1##*(} in ($1|*[!0-9]*\)|\)*)
cp "$1" "${1%.*}(1).txt";;
(*\)*) set "${1##*(}" "$@"; cp \
"$2" "${2%"$1"}$((${1%)*}+1))).txt"
shift;; esac
shift; done
我认为这应该可以很好地处理所有情况。它将增加(复制)如果需要的话,数字 - 但否则只会插入一个(1)位于扩展名和文件名之间。
答案4
在 中zsh
,通配符移动或复制随 shell 一起提供:
autoload zmv
zmv -C '(*).txt' '$1 (1).txt'
但我真的建议不要在文件名中使用空格来达到此目的,而且括号也不是理想的选择。我提到这一点是因为每次我遇到这样的模式(例如x.txt
and x (1).txt
and x (2).txt
)并且想要在没有双引号的情况下进行制表符完成时,我必须编写x <tab> <backslash> <space> <backslash> ( 1 <tab>
以使其正确。此外,它在ls
输出中看起来很混乱,因为并不清楚文件名的结尾位置。我会用x.txt
,x.1.txt
和x.2.txt
.这样,文件名在视觉上显示为单个单元,并且此补全工作正常:x <tab> .1 <tab>
.