标签: bash

在 Linux 中递归修复图像文件扩展名

我有一堆来自错误命名的扫描/传真的图像文件,我需要为我们的 Linux 用户修复。事实证明,我们有一堆扫描件是 PNG 文件,这些文件被标记为 *.jpg,反之亦然。在 Windows 下,这从来都不是问题,因为资源管理器/Office 只会忽略扩展名。但是在 Linux 下,Eye of GNOME 等最终只是拒绝打开文件,因为内容与扩展名不匹配。

有没有人对可以做到这一点的工具或一小段脚本有任何建议?我可以编写一个 C 程序来做到这一点,但这似乎有点矫枉过正。只是坐下来手动手动重命名不是一种选择,有数千种。

编辑:我看到该file命令将查看文件的实际内容并显示它是什么。我不太确定如何使用它的信息。

linux script bash images

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

意外的 Bash glob 完成使用第一个匹配,即使不明确

如果我在目录中有以下文件:

$ ls
a-file-1
b-file-2
something-else
Run Code Online (Sandbox Code Playgroud)

我输入

$ cat *file*<TAB>
Run Code Online (Sandbox Code Playgroud)

该行意外更新为

$ cat a-file-1 |
Run Code Online (Sandbox Code Playgroud)

(管道表示光标)即使 glob 也匹配b-file-2. 有点奇怪的是,如果我启动另一个 shell,我会在 double- 上得到一个匹配列表TAB(我更喜欢):

$ cat *file*<TAB><TAB>
a-file-1  b-file-2
$ cat *file*|
Run Code Online (Sandbox Code Playgroud)

问:这种行为是如何配置的?我想在登录外壳中有第二个行为。

似乎登录 shell 获得了第一个行为,非登录 shell 获得了第二个行为。但是, my~/.bash_profile所做的只是 kick off ~/.bashrc。(我没有.profile。)似乎我必须在某处更改配置。

shopt区别是,只有登录shell都有extglob onhostcomplete offlogin_shell on而改变这些不改变上述行为。set -o输出是一样的。试过了,set show-all-if-ambiguous on但没有效果。我正在使用 Ubuntu 14.04.1。

更新关于通过@mpy评论

在非登录 shell 中,当我在 glob 中包含一个基本目录并按 …

linux bash shell

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

在 find/grep 搜索结果中保留换行符

我正在使用以下脚本递归搜索从其他文件调用的 php 脚本的出现。

find . -exec grep -Hn $1 {} \; | grep -v ^Binary;
Run Code Online (Sandbox Code Playgroud)

效果很好!现在,我需要返回的结果来确定下一步要采取的行动。

r=$(find . -exec grep -Hn $str {} \; | grep -v ^Binary;)

 if [ -z "$r" ];
    then
          Do this
    else
          Do something else
    fi
Run Code Online (Sandbox Code Playgroud)

问题: find 脚本通过它自己返回结果,每个结果都在一个新行上。

./path/to/file.php
./path/to/another_file.php
./path/to/third_file.php
Run Code Online (Sandbox Code Playgroud)

但是,将输出分配给 $r 变量时,不会保留换行符,结果打印在一行上,因此难以阅读。

./path/to/file.php ./path/to/file.php ./path/to/third_file.php
Run Code Online (Sandbox Code Playgroud)

如何在将输出分配给变量时保留换行符?

bash grep find newlines

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

Grep 过滤巨大的 CSV 文件

我正在处理一个包含超过 200 万行的 CSV 文件。相当大的一个。

如果第二列的值与“jpn”或“por”匹配,我需要使用 grep(或任何更好的方法)来检索整行。

我尝试使用grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv但到目前为止没有成功。主要问题是“por”在第三列中很常见,它会产生超过一百万的不需要的行。

有没有更有经验的用户会善待并借我一些帮助?

提前致谢!:D

bash grep csv

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

从 emacs 控制台模式复制粘贴时删除虚假的结尾空格?

控制台模式下使用emacs,我想从 emacs 复制鼠标选定的文本并将其粘贴到另一个应用程序(可能是另一个术语)。

但是 emacs 会为选择添加完整的空间以填充整个屏幕宽度。

雪上加霜,vim效果完美。我不得不切换到vim(或cat)来做一个简单的复制/粘贴。

作为测试场景,您可以在 emacs 中编写此文本(在控制台模式下运行):

(echo Does it work: \
 true)
Run Code Online (Sandbox Code Playgroud)
  1. 用鼠标选择此文本(两行)。
  2. 将其粘贴到终端,然后按

如果它写道:

Does it work: true
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作(复制粘贴工作),你没有我的问题(为什么?)。但是,在我的电脑上,我看到:

Does it work:
Run Code Online (Sandbox Code Playgroud)

并且缺少“真实”:它失败了,如本期当前所述。

有什么建议吗?

bash vim emacs copy-paste

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

在 bash 中,声明一个依赖于当前变量内容的别名

我想声明一个别名(在 my 中.bash_profile),它将在使用别名时使用变量的内容(值),而不是在定义时使用。例如,

alias goSomeWhere="cd $BASE/somewhere"
Run Code Online (Sandbox Code Playgroud)

$BASE定义别名时未设置,仅在使用时设置。但是,因为$BASE是在定义别名时(在登录时)计算的,所以goSomeWhere别名被解释为cd /somewhere.

如何延迟对变量的评估,直到执行别名?

linux bash shell environment-variables

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

linux shell中的状态行

我使用 Windows 和 Putty 来远程连接(ssh)到一些 linux 服务器。我已经在我的 .screenrc 文件中设置了我的 hardstatus,以便我可以监控一些有用的信息。但这仅在我在屏幕中时才有效。

我想在 Screen 之外使用同样的东西。所以,基本上,当我在屏幕外的 bash shell 上时,我想要一个状态栏(类似于 Screen 的状态栏)。

这甚至可能吗?我该怎么做?如果没有,有什么替代方法吗?

PS:我的目标是在状态栏中显示更新我对服务器的访问权限的当前时间和截止日期。

linux display bash shell statusbar

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

为什么“vi”命令会打开“vim”编辑器?

我正在使用 Ubuntu 12.04。并不是说我在抱怨,因为我喜欢我的vim并且更喜欢它的许多功能。但是,我很好奇它为什么会这样做。它没有别名,.bashrc或者.bash_profile.我不确定它从哪里得到这种行为。有人可以解释一下吗?而且,出于好奇,是否可以启动经典vi

linux bash vim vi ubuntu

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

Tmux - 在启动时在会话中执行命令

我想做的事情真的很简单,但我似乎找不到一个直截了当的答案。

我发现了这个问题这个问题,但它们并不是我所需要的——我没有运行多个会话或窗口或任何类似的东西——我只是想让 tmux 在它自己内部执行一个命令(可能是一个 bash 脚本),打开后。

所以基本上我输入“tmux”,一个会话打开,并且在会话中 tmux 自动执行“hello_world.sh”或类似的东西。

有谁知道如何做到这一点?.tmux.conf 文件似乎没有“发送密钥”,但我可能使用错误。

谢谢大家。

编辑:感谢 JohnKiller 回答了我自己的问题。我没有想到 /root/.bashrc 在登录时运行的事实,以及当 TMUX 打开时。我在其中添加了一个 if 语句,请在下面回答。

bash tmux

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

如何在不等待整行的情况下为程序输出添加一个字符串?

我有一个使用 SSH 在远程服务器上运行命令的脚本。我想将字符串添加Remote:到输出的每一行,但我不希望每一行都被延迟,直到整行可用。这是我的命令的输出:

$ myproject-db-push my_database_name
从数据库导出...完成
归档数据...完成
上传档案到远程...完成
在远程运行安装脚本
远程:将存档解压缩到临时目录...完成
远程:使用数据库:my_database_name
远程:删除集合:
远程:- my_collection_foo
远程:- my_collection_bar
远程:导入新数据...完成

在这种情况下,我是这样使用的sed

echo "$INSTALLCMD" | ssh -T "deploy@$SERVER" | sed -u "s/^/Remote: /"
Run Code Online (Sandbox Code Playgroud)

问题是,正如我所解释的,没有部分行打印到屏幕上。如果我移除| sed零件,它会按预期工作。首先是这样写的:

正在导入新数据... 

几秒钟后,该行完成:

正在导入新数据...完成

我假设sed只能逐行工作。我尝试将其设置为无缓冲,但它仍然等待整行。有没有另一种方法来实现这一点?

bash sed sh shell-script

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

标签 统计

bash ×10

linux ×5

shell ×3

grep ×2

vim ×2

copy-paste ×1

csv ×1

display ×1

emacs ×1

environment-variables ×1

find ×1

images ×1

newlines ×1

script ×1

sed ×1

sh ×1

shell-script ×1

statusbar ×1

tmux ×1

ubuntu ×1

vi ×1