循环使用Bash脚本删除多个文件的第一行

Mar*_*rko 8 bash

一般都是Bash脚本和编程的新手.我想自动删除目录中多个.data文件的第一行.我的脚本如下:

#!/bin/bash
for f in *.data ;
do tail -n +2 $f | echo "processing $f";
done
Run Code Online (Sandbox Code Playgroud)

我得到了回音消息但是当我抓住文件时没有任何改变.有任何想法吗?

提前致谢

dev*_*ull 18

我得到了回音消息但是当我抓住文件时没有任何改变.

因为简单的tailing不会改变文件.

您可以使用sed排除的第一行就地修改文件.话

sed -i '1d' *.data
Run Code Online (Sandbox Code Playgroud)

将从所有.data文件中删除第一行.


编辑:BSD sed(在OSX上)会期望参数-i,所以你可以指定一个扩展来备份旧文件,或者就地编辑文件,比如说:

sed -i '' '1d' *.data
Run Code Online (Sandbox Code Playgroud)

  • @devnull这只删除了dir中1个文件的第一行,而不是所有文件. (5认同)

pfn*_*sel 4

您没有更改文件本身。通过使用tail您只需读取文件并将其部分内容打印到stdout(终端),您必须将该输出重定向到临时文件,然后用临时文件覆盖原始文件。

#!/usr/bin/env bash
for f in *.data; do
    tail -n +2 "$f" > "${f}".tmp && mv "${f}".tmp "$f"
    echo "Processing $f"
done
Run Code Online (Sandbox Code Playgroud)

此外,尚不清楚您希望通过该echo命令实现什么目标。为什么|在那里使用管道 ( ) ?

将为您提供一种更简单的方法来实现这一目标。请参阅 devnull 的回答。