在同一目录中创建文件的副本

在同一目录中创建文件的副本

假设我有一个包含以下文件的目录:

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.txtand x (1).txtand x (2).txt)并且想要在没有双引号的情况下进行制表符完成时,我必须编写x <tab> <backslash> <space> <backslash> ( 1 <tab>以使其正确。此外,它在ls输出中看起来很混乱,因为并不清楚文件名的结尾位置。我会用x.txt,x.1.txtx.2.txt.这样,文件名在视觉上显示为单个单元,并且此补全工作正常:x <tab> .1 <tab>.

相关内容