Bash:删除第一行文件,在新目录中创建带前缀的新文件

时间:2015-07-20 17:00:14

标签: bash file-io

目录中有一堆文件, old_dir 。我想:

  1. 删除每个文件的第一行(例如,使用“sed'1d'”)
  2. 将输出保存为带有前缀 new _ 的新文件,添加到原始文件名中(例如,使用“{,new_} old_filename”)
  3. 将这些文件添加到其他目录 new_dir ,覆盖任何冲突的文件名
  4. 如何使用Bash脚本执行此操作?无法将各个部分放在一起。

1 个答案:

答案 0 :(得分:0)

#!/usr/bin/env bash

old_dir="/path/to/somewhere"
new_dir="/path/to/somewhere_else"
prefix="new_"

if [ ! -d "$old_dir" -o ! -d "$new_dir" ]; then
  echo "ERROR: We're missing a directory. Aborting." >&2
  exit 1
fi

for file in "$old_dir"/*; do
  tail +2 "$file" > "$new_dir"/"${prefix}${file##*/}"
done

这一点的重要部分是:

  • for循环,允许您处理每个$file
  • tail +2这是应该删除文件第一行的符号。如果您的tail不支持此功能,则可以使用sed -e 1d获得相同的结果。
  • ${file##*/}功能上等同于basename "$file",但不会产生孩子。

真的,这些都不是特定于bash的。您可以在大多数操作系统中的/bin/sh中运行它。

请注意,上面的代码旨在解释进程。一旦理解了这个过程,您就可以提出更快,更短的策略来实现同样的目标。例如:

find "$old_dir" -depth 1 -type f -exec sh -c "tail +2 \"{}\" > \"$new_dir/$prefix\$(basename {})\"" \;

注意:我还没有测试过这个。如果您打算使用这些解决方案中的任何一种,请确保在尝试之前了解它们,这样您就不会意外地破坏数据。