【问题标题】:bash shell script to clone files用于克隆文件的 bash shell 脚本
【发布时间】:2018-03-20 21:41:07
【问题描述】:
cd /home/foo/

for f in `seq -w 01 10`
   do
   cat $f > /home/foo/cloned_files/"$f".$i
done

情况: 我在/home/foo 中只有 1 个文件。 我想克隆该文件 10 次并将迭代号添加到文件名中。最后,我应该有 10 个内容相同但后缀表示其序列号的文件。

示例: /home/foo/xfile.txt

执行脚本后,我应该有: xfile.txt.01, xfile.txt.02, xfile.txt.03...xfile.txt.10 在 /home/foo/cloned_files/

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 你为什么要做cat 和重定向而不是仅仅使用cp
  • seq 不是 POSIX 指定的,不是 bash 的一部分,否则不能移植/保证在任何给定系统上具有任何特定行为,即使该系统已知运行 bash。做类似for ((f=1; f<=10; f++)); do printf -v num '%02d' "$f"; echo "Number is $num"; done 的事情要安全得多
  • 总之,看起来你想遍历文件,所以你应该有两个循环,一个循环你的文件,一个循环你的数字:for filename in *; do [[ -f "$filename" ]] || continue; for (( i=1; i<=10; i++)); do printf -v num '%02d' "$num"; cp "$filename" cloned_files/"$filename.$num"; done; done

标签: bash shell unix cloning


【解决方案1】:

试试这个,使用你的标签的规范方式:纯

for i in {01..10}; do
    cp "filename" "/path/to/xfile.txt.$i"
done

如果您需要整数范围是动态的:

integer=10 # <= variable
for i in $(seq -w 1 $integer); do
    cp "filename" "/path/to/xfile.txt.$i"
done

就像@Charles Duffy 在 cmets 中所说,一个更便携的解决方案(seq 与 bash 无关,它是一个外部命令):

for ((i=1; i<=10; i++)); do
    printf -v num '%02d' "$i"
    cp "filename" "/path/to/xfile.txt.$num"
done

更进一步:TestsAndConditionals

man cp

CP(1)

名字

cp - 复制文件和目录

注意事项:

【讨论】:

  • 谢谢,输出文件只有一个文件 --> xfile.txt.{01..10}
  • @user2585000,您的真实代码是否可能从变量中获取10,而不是对其进行硬编码?这不起作用,如BashPitfalls #33 中所述。否则,如果使用的是 bash 3.x,我对常量的最坏行为将以 1 而不是 01 开头。
  • 你标记了 POST bash,所以使用 bash :) 为动态范围添加了另一个 sn-p
  • 添加了@CharlesDuffy 推荐
  • 我会小心使用“便携”来描述我的建议——它可以移植到不提供 OP 特定 seq 实现的平台上;它 not 可移植到非 bash shell。 (对于 ksh、f/e,可以将其设为 num=$(printf '%02d' "$i");对于 POSIX sh,需要替换 C 样式的 for 循环,就像 i=1; while [ "$i" -le 10 ]; do ...; i=$((i + 1)); done
【解决方案2】:

使用 GNU Parallel

的另一种选择
parallel --dry-run cp file /elsewhere/file.{} ::: {01..10}

样本输出

cp file /elsewhere/file.07
cp file /elsewhere/file.08
cp file /elsewhere/file.09
cp file /elsewhere/file.06
cp file /elsewhere/file.05
cp file /elsewhere/file.04
cp file /elsewhere/file.03
cp file /elsewhere/file.02
cp file /elsewhere/file.01
cp file /elsewhere/file.10

如果输出看起来不错,请删除--dry-run 并再次运行命令以实际执行此操作。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 2012-06-07
    • 2020-10-06
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2020-10-26
    • 2022-06-10
    • 2012-01-28
    相关资源
    最近更新 更多