小编Que*_*ner的帖子

如何在 Bash 中将文本附加到多个文本文件的开头和结尾?

我有一个充满文本文件的目录。我的目标是将文本附加到所有这些的开头和结尾。每个文件的开头和结尾的文本都是相同的。

根据我从网上得到的代码,这是附加到文件开头的代码:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt
Run Code Online (Sandbox Code Playgroud)

这是附加到文件末尾的代码。目标是};在每个文件的末尾添加文本:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt
Run Code Online (Sandbox Code Playgroud)

我从中提取的示例用于对单个文件进行操作。我想我会尝试使用通配符对多个文件进行操作,*.txt.

我也可能犯了其他错误。无论如何,如何将文本附加到多个文件的开头和结尾?

shell-script text-processing files

27
推荐指数
3
解决办法
13万
查看次数

这个 ddrescue 命令有什么作用吗?

在尝试从发生故障的硬盘驱动器恢复数据的过程中,我正在运行该命令ddrescue

该命令已经运行了 9 天,我从磁盘活动的声音中认为它可能正在执行某些操作。命令行输出一直看起来或多或少是静态的:

$ sudo ddrescue -r3 /dev/sdb /home/dave/RECOVERY/usb500.image /home/dave/recovery_usb500.logfile

Press Ctrl-C to interrupt
Initial status (read from logfile)
rescued:         0 B,  errsize:       0 B,  errors:       0
Current status
rescued:         0 B,  errsize:    500 GB,  current rate:        0 B/s
   ipos:     2539 MB,   errors:       1,    average rate:        0 B/s
   opos:     2539 MB,     time from last successful read:     9.7 d
Splitting failed blocks... 
Run Code Online (Sandbox Code Playgroud)

一直在变化的一个部分是它说ipos和的地方opos。花了 9 天时间才恢复到大约500000 MB,这是发生故障的磁盘驱动器的大小。然而,当它到达那里时,它又下降到0并开始再次上升。在我写这篇文章的时候,它大约在2580 MB …

data-recovery hard-disk ddrescue

9
推荐指数
2
解决办法
2万
查看次数

如果我更改了 tar 文件的权限,这是否适用于其中的文件?

我有一个通过 定期运行的脚本cron,它创建一个tar.gz文件以备份目录。

由于我无法控制的原因,唯一可以通过执行脚本cron的用户是 root 用户。因此tar,任何其他用户都无法移动或删除生成的文件。

因此,作为脚本的一部分,我想在文件上执行chownand以便其他用户可以操作它。chmodtar

但是仅更改tar文件的权限就足够了,还是将 root 用户权限也保存到tar. 当用户解压缩tar文件时,他们是否能够像他们自己创建文件一样处理这些文件?

tar permissions chmod chown

5
推荐指数
2
解决办法
5790
查看次数

如何替换最后一个非空行中的文本?

我想找到文件中的最后一行文本,并删除其末尾的逗号。我已经问过这个问题了,但是,在得到答案后,我意识到我的问题不够具体。

sed命令将转到文件的最后一行并对其执行操作。就我而言,我想删除结尾的逗号:

sed -i '$ s/",/"/g' file.txt
Run Code Online (Sandbox Code Playgroud)

所以这:

blah blah blah,
blah blah blah,
blah blah blah,
Run Code Online (Sandbox Code Playgroud)

...变成这样:

blah blah blah,
blah blah blah,
blah blah blah
Run Code Online (Sandbox Code Playgroud)

但是,如果文件中最后一行文本后面有空行,则此方法将不起作用。

我一直在寻找获取最后一行文本的方法,但还没有想出任何我可以理解和应用的方法。我还寻找了删除所有尾随空白行的方法,并找到了以下命令:

sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' *.txt
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用(它似乎只是在命令行上输出我的文件的内容)。无论如何,这都是不优雅的。我不想删除尾随的空白行,最好只识别最后一行包含文本的内容并对其采取行动。

如何删除目录中多个文件的最后一行文本中的逗号?

text-processing

5
推荐指数
2
解决办法
3497
查看次数

我可以在新的 Linux 安装中复制我的 Apache 服务器设置吗?

我在我的计算机上设置了一个 Apache 2 服务器,用于本地测试。需要明确的是,它不是在互联网上托管网站。它仅用于本地调试和设计。

我使用的是 Ubuntu Linux,但现在我有一台使用 Linux Mint 的新计算机。我想要做的是获取我在旧 Ubuntu 机器上拥有的所有 Apache 站点和设置,并在新的 Linux Mint 机器上复制它们。

我只知道如何手动执行此操作,一次一个站点,从头开始。为目录中的每个站点创建一个文件sites-available并使用a2ensite. 然后对任何配置文件进行编辑,例如在我的php.ini文件中添加一些行以启用 Xdebug,并希望我没有遗漏任何内容。

我确信我这样做的效率很低,而且很容易出现人为错误。

是否不可能以某种方式在我的 Ubuntu 机器上复制整个 Apache 2 设置和站点,然后一次性将它们放在我的 Linux Mint 机器上?或者至少,以最少的步骤重新创建每个站点并从头开始设置?

请注意,我更像是一名设计师而不是管理员,所以请假设我对 Linux 命令和服务器设置的了解很少。

configuration cloning apache-httpd

5
推荐指数
1
解决办法
2万
查看次数

我在哪里设置 FollowSymLinks?

我刚刚在新的 Linux Mint 安装上设置了一个 Apache 2.2 服务器。我正在重新创建以前在旧 Ubuntu 机器上的设置。

在我以前的计算机上,我必须启用FollowSymLinksin httpd.conf,因为我将我的网站 HTML 文件存储在我的主目录中,并从/var/www.

在我的新服务器上,我找不到任何httpd.conf地方,所以我似乎无法设置跟随符号链接的选项。结果,我收到了一个403 Forbidden: You don't have permission to access / on this server错误。

另外,在我的错误日志中,它说:

[Sun May 05 02:12:17 2013] [error] [client 127.0.0.1] Symbolic link not allowed or link target not accessible: /var/www/Websites
Run Code Online (Sandbox Code Playgroud)

允许符号链接的方式有什么改变吗?还是我的设置有误httpd.conf?无论如何,如何让我的新 Apache 遵循符号链接?


更新:根据下面的答案,我检查了文件/etc/apache2/sites-enabled/000-default/etc/apache2/sites-available/default,它们都有FollowSymLinks选项。我可能会收到上述错误,还有其他原因吗?

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks …
Run Code Online (Sandbox Code Playgroud)

apache-httpd

5
推荐指数
1
解决办法
2万
查看次数

为什么这个 awk 命令不能像 sed 那样与 find 一起使用?

我正在创建一个Bash shell 脚本来对一些 HTML 文件进行一些文件操作。

在我执行的许多操作中,我有一个非常有效的sed命令:

find $DIR -type f -name '*.html' -exec sed -i 's/.*<script type="text\/javascript" charset="utf-8" src="file.js"><\/script>.*/<script type="text\/javascript" charset="utf-8" src="file2.js"><\/script>/g' {} \;
Run Code Online (Sandbox Code Playgroud)

它查看相关目录中的每个 HTML 文件,并替换一行文本。

我想做一些类似的事情,在两个 HTML 注释之间替换多行。

所以我想采取这个:

<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->
Run Code Online (Sandbox Code Playgroud)

我发现这个awk命令在我在一个文件上运行时似乎有效:

awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html
Run Code Online (Sandbox Code Playgroud)

所以我想我可以执行find我使用的相同功能sed并在此处应用该方法,以便awk在目录中的每个 HTML 文件上运行此命令:

find $DIR …
Run Code Online (Sandbox Code Playgroud)

sed find awk

4
推荐指数
1
解决办法
1151
查看次数

为什么我的 mmv 命令没有覆盖文件?

我有一个批处理文件,除其他外,它使用该命令mmv重命名一些文件。相关行是这样的:

mmv "$BASEDIR/files/*.txt" "$BASEDIR/files/#1.strings"
Run Code Online (Sandbox Code Playgroud)

本质上它是有效的,但问题是当文件碰巧已经存在时,它不断要求我确认覆盖文件。我希望它在没有确认的情况下继续执行,所以我检查了手册页mmv,它说只需使用该-o选项,如下所示:

mmv -o "$BASEDIR/files/*.txt" "$BASEDIR/files/#1.strings"
Run Code Online (Sandbox Code Playgroud)

不过,这没有任何区别。每次我运行我的脚本时,当涉及到mmv部分时,它开始要求我确认。

为什么该-o选项不起作用,我如何在mmv不要求确认的情况下覆盖?

command-line mmv

4
推荐指数
1
解决办法
2118
查看次数

如何删除文件最后一行的文本?

我正在使用 Bash shell 脚本来构造一个包含 Javascript 数组的文本文件。据我了解 Javascript,数组中的最后一项不能有逗号。在我的 Javascript 中,这给了我错误。

我有一个用其他代码生成的项目列表,结果如下所示:

text0161: "blah",
text0162: "blah blah",
text0163: "blah blah blah",
Run Code Online (Sandbox Code Playgroud)

我需要取最后一行,text0163: "blah blah blah",并删除结尾的逗号,所以它变成text0163: "blah blah blah".

在我的处理过程中, 之后没有任何内容text0163: "blah blah blah",因此我可以查找文件中的最后一行并删除逗号。但是,该行的内容可能会更改,因此它并不总是完全相同的text0163: "blah blah blah",. 它可能会变成其他任何东西,例如text2020: "doobie doobie doo",.

我知道我可以使用 sed 删除逗号,如下所示:

sed -i 's@,@@g' file.txt
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在最后一行做到这一点。

bash

4
推荐指数
1
解决办法
2943
查看次数

如何在不关闭自己的情况下远程关闭端口?

我在另一个大陆的远程位置有一台 Ubuntu 11.04 服务器,所以我无法物理访问它。我只通过ssh(和scp)与它交互,并且打算只以这种方式与它交互。

出于安全目的,我想确保服务器上的所有端口都绝对关闭,除了 ssh.

尽管试图在网上找到说明,但我的理解仍然很模糊。到目前为止,我收集到的是我需要“刷新”“iptables”,还需要编辑一些文件(/etc/hosts,也许?),然后重新启动机器。

显然,尽管如此,我想对此非常小心,因为如果我做错了,我最终可能会意外关闭 ssh 端口,使我无法访问服务器。

在我这样做之前,我希望建立一套简单的步骤。

那么,如何在保留访问权限的同时关闭所有端口?

额外问题:在执行此操作时,我是否应该并且可以将ssh端口从 22 更改为非标准端口?真的有区别吗?

linux firewall iptables

2
推荐指数
1
解决办法
799
查看次数