标签: bash-scripting

无法从 bash 脚本调整 tmux 窗格的大小

背景和问题:

我创建了一个 tmux 脚本来打开几个窗口。它工作得很好,但后来我想在一个窗口上放置一个垂直拆分的窗格并将其大小调整为 5 个字符高。我无法让我的 bash 脚本正确调整窗格大小。根据我尝试的命令,它会增加或减少大小,但它的行为就像从 bash 执行时绑定到某个范围一样。

我尝试过的一些命令/变体:

  1. tmux split-window -v -l 5 -t 0 有和没有 -t 0
  2. tmux split-window -v -p 5 -t 0 有和没有 -t 0
  3. tmux split-window -v 后跟 tmux resize-pane -D 23 -t 1 有和没有 -t 参数
  4. 我还尝试了以下变体:tmux send-keys C-b '"' C-m其次是tmux send-keys C-b ':resize-pane -D 20'但通常将引号和 resize-pane 命令转储到实际的终端缓冲区中,而不是使用 tmux 执行命令。

任何数量的最佳情况是窗格从屏幕的一半(56 行 / 2 = 28 行)调整到 20 行高(我的终端是 56 行高,因此一半 - 20 = 8)。或者,如果我将 resize-pane 命令设置为 -U …

bash tmux bash-scripting

6
推荐指数
1
解决办法
4019
查看次数

处理以前未处理过的文件夹中的文件

我在目录中有一系列文件,我需要使用脚本执行操作。操作完成后,我想保留文件已处理的日志,以便下次运行脚本时,它不会再次尝试执行操作。

所以可以说我可以找到所有应该像这样处理的文件:

for i in `find /logfolder -name '20*.log'` ; do
    process_log $i
    echo $i >> processedlogsfile
done
Run Code Online (Sandbox Code Playgroud)

所以我有一个包含我处理过的日志的文件,我的目标是修改 for 循环,这样这些处理过的日志就不会被第二次处理。

每次手动扫描似乎效率低下,尤其是当处理的日志文件变大时:

 if grep -iq "$i" processdlogfiles ; then continue; fi
Run Code Online (Sandbox Code Playgroud)

如果在设置 for 循环时可以排除这些文件,那就太好了。

请注意,有问题的操作系统是 linux 衍生产品,一个管理设备,具有有限的工具集(attr例如没有命令),因此无法安装其他实用程序(这是可能的,但不是一个选项)。不过,大多数常见的 bash shell 命令都可用。

此外,已处理文件的文件名和位置必须保持原样 - 不能更改它们以反映其处理状态

unix shell-script bash-scripting

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

如何将所有兄弟文件夹移动到一个文件夹中?

我很抱歉这似乎是一个愚蠢的问题,但我不能把它搞砸。

我有一堆这样的文件夹:

/users/me/foo/oops1

/users/me/foo/oops2

/users/me/foo/oops3

/users/me/foo/oops4

/用户/我/富人/酒吧

不幸的是,它们并没有统一命名,并且有数百个 oops 文件夹。

我打算将所有 oops 文件夹复制到 bar 中。有没有一种简单的方法可以将所有 oops 文件夹移动到 bar 中,而不会导致某种递归移动问题?

复制文件花了几个小时。我希望行动会快得多。

顺便说一下,这是在 redhat linux 服务器上。我只有 ssh 访问权限。

我想如果我这样做

cd foo
mv * bar
Run Code Online (Sandbox Code Playgroud)

会有问题。

linux file-transfer bash-scripting

6
推荐指数
2
解决办法
3125
查看次数

有没有办法在 bash 上通过管道传递参数?

有没有办法在bash上通过管道传递参数?

就像是:

echo value1 value2 | mkdir -p ./$1/$2
Run Code Online (Sandbox Code Playgroud)

上面的行将创建目录 ./value1/value2

如果这是不可能的,我会接受建议。

任何帮助表示赞赏。

bash bash-scripting

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

Bash:比 tee 更好的输出到控制台和输出文件的方法?

我需要显示的是定期刷新的日志。这是一个大约 10 行文本的块。我正在使用 |tee,它现在可以工作。然而,表现却不太令人满意。它等待一段时间,然后从多次刷新中输出几块文本(特别是当程序刚刚启动时,需要相当长的时间才能开始在控制台上显示任何内容,我第一次看到这个时,我以为程序挂了)。另外,它在最后一个块的中间随机断裂,因此呈现起来相当难看。

有没有办法改善这一点?(也许每次输出更少,并更频繁地在输出文件和控制台之间切换?)

更新:这是我的 bash 脚本中的内容: tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

linux bash command-line bash-scripting

6
推荐指数
1
解决办法
7739
查看次数

tmux - 在 bash 脚本中获取另一个窗格的密码?

有没有办法从 tmux 会话中找出有关任何窗格的当前工作目录的信息?

我想编写一个 bash 脚本,将当前窗格的目录更改为另一个窗格的目录,即使该窗格中已经运行了一个程序或脚本。

我想做的方法是导航到窗格 1,然后转到窗格 2,按一个热键,窗格 2 现在将更改为与窗格 1 相同的密码。

zsh shell-script tmux bash-scripting

6
推荐指数
1
解决办法
1692
查看次数

如何将 shell 脚本的输出作为 cron 作业邮寄

我创建了一个运行 shell 脚本的 cron 作业。我希望 shell 脚本运行并捕获它的输出,并在完成后通过电子邮件发送。到目前为止,这是我所拥有的,但邮件正文是空的。

我已经尝试了以下所有方法:

/root/myscript.sh | tee output.txt | mail -s "Email subject" me@mymail.com

/root/myscript.sh | tee output.txt | mail -s "Email subject" me@mymail.com &> /dev/null

/root/myscript.sh | tee output.txt && mail -s "Email subject" me@mymail.com < output.txt &> /dev/null

/root/myscript.sh > tee output.txt && mail -s "Email subject" me@mymail.com < output.txt &> /dev/null
Run Code Online (Sandbox Code Playgroud)

所有这些都正常运行,但它们会产生一封空正文的电子邮件。运行脚本确实会在 stdout 上产生输出。

linux email bash cron bash-scripting

6
推荐指数
1
解决办法
3万
查看次数

带空格的 Bash 变量(目录)

我试图在/foo保留列出目录中的空格的同时回显所有文件。目前,名为目录"bar1 bar2"将回声出作为/path/to/foo/bar1/然后/bar2file.txt全部上新的生产线。我需要它来 echo/path/to/foo/bar1 bar2/file.txt/path/to/foo/bar1\ bar2/file.txt.

for file in $(find /path/to/foo/ -type f); do
  if [[ ... ]]; then
    echo "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

还试过:

for file in $(find /path/to/foo/ -type f | sed 's/ /\ /g'); do
  if [[ ... ]]; then
    echo "${file}"
    echo "$file" # variations i've tried
    echo $file   # variations i've tried
    echo ${file}
    otherCommand "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

linux bash shell ubuntu bash-scripting

6
推荐指数
1
解决办法
2167
查看次数

无法通过共享连接进行 scp

我在使用 SSH 共享连接时遇到以下问题:

# Set up a shared connection
ssh -f -N -M -S "$SSH_CONTROL_SOCKET" root@"$ONE_HOST"

# I can scp *without* the shared connection
scp root@"$ONE_HOST":/etc/hosts /dev/null

# I can execute a remote command *with* the shared connection
ssh -S "$SSH_CONTROL_SOCKET" root@"$ONE_HOST" "date"

# But I can't scp *with* the shared connection
scp -vvv -S "$SSH_CONTROL_SOCKET" root@"$ONE_HOST":/etc/hosts .
Run Code Online (Sandbox Code Playgroud)

该脚本给出以下输出:

hosts                                                              100%   59    67.8KB/s   00:00
Wed Feb 28 08:23:10 MST 2018
Executing: program /home/myUser/ssh_sharing_socket host myHost.example.com, user root, command scp -v …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash openssh bash-scripting

6
推荐指数
1
解决办法
1840
查看次数

在 Bash 中将文本动态附加到文件名

我有以下for循环来单独处理sort文件夹内的所有文本文件(即为每个文件生成一个排序的输出文件)。

for file in *.txt; 
do
   printf 'Processing %s\n' "$file"
   LC_ALL=C sort -u "$file" > "./${file}_sorted"  
done
Run Code Online (Sandbox Code Playgroud)

这几乎是完美的,除了它当前以以下格式输出文件:

originalfile.txt_sorted
Run Code Online (Sandbox Code Playgroud)

...而我希望它以以下格式输出文件:

originalfile_sorted.txt 
Run Code Online (Sandbox Code Playgroud)

这是因为该${file}变量包含文件名,包括扩展名。我在 Windows 上运行 Cygwin。我不确定这在真正的 Linux 环境中会如何表现,但在 Windows 中,这种扩展名的转换会使 Windows 资源管理器无法访问该文件。

如何将文件名与扩展名分开,以便我可以_sorted在两者之间添加后缀,从而轻松区分文件的原始版本和排序版本,同时仍保持 Windows 的文件扩展名不变?

我一直在看什么或许可能的解决方案,但对我来说,这些似乎更配备以处理更复杂的问题。更重要的是,以我目前的bash知识,它们超出了我的头脑,所以我希望有一个更简单的解决方案适用于我的简陋for循环,或者有人可以解释如何将这些解决方案应用于我的情况。

windows cygwin bash filenames bash-scripting

6
推荐指数
1
解决办法
5453
查看次数