标签: bash

无法保留硬链接。为什么?

我正在尝试创建一个 Makefile 来自动重新制作 Knoppix 发行版。

我正在尝试将文件系统从只读压缩循环设备复制到普通文件系统,以便能够修改它,然后压缩它以替换旧的文件系统。这就是 Knoppix 重新制作的意义所在。我必须保留有关文件系统的所有详细信息,从一个文件系统到另一个文件系统重新创建硬链接结构。我粘贴的 ls -li 是两个不同文件系统中的同一文件,以显示源具有硬链接而目标已丢失它们。

$ ls -li */bin/dnsdomainname
   10419 -rwxr-xr-x 4 root root 12992 2010-01-19 10:40 KNOPPIX_V6.2.1CD-2010-01-31-EN.cloop/bin/dnsdomainname
10641687 -rwxr-xr-x 1 root root 12992 2010-01-19 10:40 KNOPPIX_V6.2.1CD-2010-01-31-EN.tree/bin/dnsdomainname
Run Code Online (Sandbox Code Playgroud)

这显然是可能的——如果 rsync 能够保留不同主机之间的硬链接,那么它应该能够在同一主机上的文件干之间执行此操作。

由于某种奇怪的原因,使用我知道应该完成这项工作的三种方法都不起作用,我很困惑出了什么问题。我花了几乎一个工作日来创建脚本、测试它,这似乎是阻止它完全工作的最后一部分。

方法有:

sudo nice tar -C $(NAME).cloop -cf - . | sudo nice tar -C $(NAME).tree -xvpf -
sudo cp -av --preserve=all $(NAME).cloop $(NAME).tree
sudo rsync -x -a -H --progress --delete $(NAME).cloop/ $(NAME).tree
Run Code Online (Sandbox Code Playgroud)

我有一个集成的测试套件(make changes),其中一部分正在计算两个文件系统的 md5sum,并且 diff 为空 - 这意味着文件系统之间每个文件的内容完全相同。但是,权限和硬链接号之间的差异表明,引用共享(硬链接)inode 的每个文件现在都是一个单独的inode,这不是我想要的。所有三种方法都做同样的事情错误,这真的很可疑,我已经没有想法了。

为了供您查看,这里有完整的 …

unix bash shell hardlink makefile

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

在 bash 或 zsh 中设置路径的制表符补全以类似于 tcsh

我\xe2\x80\x99m是tcsh的长期用户,但现在所有的酷孩子似乎都在使用bash或zsh(也就是说,git或其他东西的完成模式可用于bash和zsh,很少用于tcsh)。

\n\n

我的问题是,两个 shell 都有关于路径制表符补全的行为,这让我发疯,而且 I\xe2\x80\x99m 很难找到如何将它们更改为我喜欢的方式。

\n\n

这里\xe2\x80\x99s 是我\xe2\x80\x99m 过去在 tcsh 中所做的一些与其他人不同的操作的示例:

\n\n
    \n
  • /u<TAB>完成到/usr/
  • \n
  • 然后选项卡列出的内容/usr/
  • \n
  • /usr/li<TAB>完成/usr/lib并列出lib/libexec/
  • \n
  • 第二次按 Tab 键完成/usr/lib/
  • \n
  • 第三次按 Tab 键会列出以下内容/usr/lib/
  • \n
\n\n

在 bash 中,无论我点击多少次 tab,它都不会过去/usr/lib,需要我输入斜杠,而我不想这样做。

\n\n

在 zsh 中,/usr/li<TAB>首先完成 to /usr/lib,然后另一个选项卡列出lib/libexec/,第三次选项卡完成 to /usr/lib/,所有后续选项卡在/usr/lib/和 之间循环/usr/libexec/。我不知道如何度过这一点。我只想从/usr/li/usr/lib,然后/usr/lib/,然后列出其内容。

\n\n

对于Python来说也是如此。在 tcsh 中,我输入pyt<TAB>,它完成 …

bash zsh tcsh tab-completion

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

第一行输出后停止

我尝试在 Bash 脚本中执行以下操作:运行命令(例如tail -f log_file),等待特定输出到达,然后停止命令,并继续执行脚本。

我尝试了以下方法,但没有成功:

tail -f log_file | grep some_text | head -n1
Run Code Online (Sandbox Code Playgroud)

我这样没有输出。

现在,我尝试诊断问题。当我简单地运行tail -n1,然后在终端中输入一些内容时,它会在第一行之后退出。但是,如果我运行以下命令:

grep some_text | head -n1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在按 CTRL+D 之前我不会得到任何输出,然后它会打印包含 的输入的第一行some_text

我的问题是,这是为什么?如果head在第一种情况下立即输出第一行,为什么当它从管道获取输入时不输出呢?难道它不应该输出前n行的所有内容,然后退出,向管道的另一端发送 SIGPIPE 信号吗?

script bash head

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

更改使用“ls”显示的列的顺序

ls -l在 *nix(或dirWindows)上运行时是否可以更改显示列的顺序?

例如,我想查看修改日期,然后是名称,然后是其他字段(或者仅选择我想要的字段及其顺序。

如何在使用cut和修剪不需要的字段的情况下完成此操作(因为这不能解决重新排序的问题)?

bash dir ls

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

在方格上显示字符?

如何在 vim 中将字符显示为正方形?字符本身不需要是方形的,但如果您要通过字符的所有中心点绘制网格,它应该形成方形网格。

我想这样做是因为我正在为Dwarf Fortress设计堡垒布局。游戏在正方形/立方体网格上进行。

linux fonts bash vim fixed-width

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

Bash 脚本:参数无效

为什么我不能echo $1 > /sys/class/backlight/acpi_video0/brightness在简单的 bash 脚本中使用?

它给了我错误:echo: write error: Invalid argument

unix bash

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

在 bash 脚本中,如何检查是否设置了“-e”?

set -e经常在脚本中使用,但有时,脚本在某些命令中失败是可以的。
我尝试检查是否set -e打开,但找不到方法 - 没有选项(我知道)set可以提供当前值。
也尝试过这样的: set | grep errexiterrexit是选项名称-e)和set | grep "-e",没有运气。
我想检查是否errexit设置了该选项,以便我可以在我随着时间的推移构建的一些库函数中暂时禁用它(如果需要,可以使用set +e和重新应用set -e)。就像是:

if [ errexit is set ]; then
   ERR_EXIT=1
   set +e
fi
...
run some code that may fail
...
if [ "${ERR_EXIT}" = 1 ]; then
    set -e
fi
Run Code Online (Sandbox Code Playgroud)

bash exit-code

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

如何解压缩文件名开头带连字符的文件

我有一个 Zip 文件,其名称开头带有一个连字符,比方说 '- stuff.zip'

如果我需要移动或复制文件,这意味着我需要使用双连字符,这样文件名就不会被解释为一个选项:

cp -- '- stuff.zip' '- stuff2.zip'
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试对这个文件使用解压缩,那是行不通的:

unzip -l -- '- stuff.zip'

error:  -fn or any combination of -c, -l, -p, -t, -u and -v options invalid
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能想到的简单和双引号、反斜杠、变量中的文件名的组合,但我无法让它工作。我无法重命名文件,因为脚本将在只读文件系统上运行。

有效的一件事是使用 find :

find -maxdepth 1 -name '- stuff.zip' -exec unzip -l {} \;
Run Code Online (Sandbox Code Playgroud)

但是非常不方便。

zip bash unzip bash-scripting

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

为什么处理替换不适用于 VLC 播放列表?

符合我的期望

  • cat <(shuf my_ordered_playlist.m3u)
  • echo <(shuf my_ordered_playlist.m3u)
  • vlc my_ordered_playlist.m3u

不符合我的期望

  • vlc <(shuf my_ordered_playlist.m3u)

我想做的事

  • 在每次调用 vlc 和
  • 按下后退按钮时能够后退(这--random提供了较差的支持)。

其他注意事项

  • 我可以使用此处的文档或 来实现我想要做的事情<<<吗?

vlc-media-player bash

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

如何使用 Linux 命令将 JPEG 图像转换为 RAW 图像?

我有一系列使用佳能 Powershot拍摄的 JPEG 图像到 JPEG。如何将它们转换/转换为 RAW 图像?

不是使用图形工具,而是来自命令行!

linux bash shell command-line imagemagick

5
推荐指数
3
解决办法
5522
查看次数