小编Sae*_*ati的帖子

为什么在这个脚本中等待所有子shell之后都没有执行?

在此脚本中,将拉取所有 git 存储库:

#!/bin/bash

find / -type d -name .git 2>/dev/null | 
while read gitFolder; do
    if [[ $gitFolder == *"/Temp/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/Trash/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/opt/"* ]]; then
        continue;
    fi
    parent=$(dirname $gitFolder);
    echo "";
    echo $parent;
    (git -C $parent pull && echo "Got $parent") &
done 
wait
echo "Got all"
Run Code Online (Sandbox Code Playgroud)

wait等待所有git pull子 shell。

为什么会这样?我该如何解决?

subshell wait

7
推荐指数
1
解决办法
659
查看次数

如何同时使用 ps 和 pwdx?

我有一个Top命令可以用来查看服务器中发生的情况:

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
Run Code Online (Sandbox Code Playgroud)

基本上它正在使用ps并删除一堆列。

对于每个进程 ID,我可以用来pwdx查看源目录在哪里。

但是,我坚持将 加入pwdx到上面命令的输出以将其添加为列。

你能帮忙吗?

bash ps

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

如何在 bash 脚本中进行时间测量?

基于这个答案,为了测量我的 bash 脚本中的时间,我可以使用:

start_time="$(date -u +%s.%N)"
sleep 5
end_time="$(date -u +%s.%N)"

elapsed="$(bc <<<"$end_time-$start_time")"
echo "Total of $elapsed seconds elapsed for process"
Run Code Online (Sandbox Code Playgroud)

而且效果很好。然而,由于我有很多脚本文件,我很想简化和干燥代码。例如我想实现这样的代码:

. /time.sh

start_time=now
sleep 5
end_time=now

measure_time
Run Code Online (Sandbox Code Playgroud)

换句话说,我想要另一个名为time.sh可以包含在任何地方的脚本,并且它应该有两个功能。一种是更换"$(date -u +%s.%N)"零件,一种是更换"$(bc <<<"$end_time-$start_time")"零件。

我尝试创建这些函数,但后来我意识到在 shell 中,我们无法从函数返回值。我们只能返回数字。

有没有办法将上面的代码简化为下面的代码?

bash function time

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

如何对 find 命令的每个结果运行 wc ?

我想查看使用该命令找到的每个文件中存在多少行find

我知道我可以用来wc -l查找单个文件的行数。但是,当从以下输出进行管道传输时,这不起作用find

find -type f -name package.json | wc -l
Run Code Online (Sandbox Code Playgroud)

这将返回找到的文件的计数。我想返回每个找到的文件的行数。

bash find wc

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

查找具有名称的目录,但如果其中包含特定的顶级文件,则对其进行过滤

我想找到所有已命名的目录Contents,然后从找到的结果列表中过滤它们,并仅包含那些Database.json在其中直接命名的文件的目录。

find / -type d -name Contents 2>/dev/null |
while read dir;
do
    if [ -f $dir/Database.json ]; then
        echo $dir
    fi
done
Run Code Online (Sandbox Code Playgroud)

这段代码有效。但我认为这太过分了。我认为应该有一种更简单的方法来做到这一点。

我可以重写这段代码使其变得更简单吗?

shell bash find filter

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

卡在从字符串变量中删除尾随换行符上

有时候,最简单的事情会耗费你疯狂编写 shell 脚本的时间。

Content='me \n you \n him \n'
echo $Content > Names.txt
Run Code Online (Sandbox Code Playgroud)

当我打开它时,Names.txt它末尾有两个空行。

我希望它只有一个空行。该Content变量在循环中计算,并在每次迭代中添加一个新行。所以我无法改变Content

我无法使用,echo -n因为它删除了所有新行。

我无法\n从循环中删除 ,因为在这种情况下,所有行都会相互连接。

我尝试Content=$(echo $Content | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}')使用awk删除尾随换行符,但它不起作用。我是从这个网站上的一个答案中摘下来的。

我尝试使用printf %s $Content > File.txt代替echo -e,仍然没有成功。

如何从给定字符串变量中删除尾随换行符或将其按原样写入文件并告诉 Linux 不要向其中追加另一行?

bash echo newlines

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

坚持在 bash 中将 JSON 作为参数传递

我知道很多人都问过类似的问题,但我无法使其发挥作用。

我有一个名为Dependencies

Accounts
Aggregates
Blog
Configuration
Contacts
Contents
DataTypes
Forms
Geo
Globalization
Media
Modules
Navigation
Podcast
Seo
Social
Taxonomy
Tracking
Vlog
Run Code Online (Sandbox Code Playgroud)

我有这段代码将其转换为 JSON 数组字符串:

DependenciesPath=/$Organization/Common/Dependencies
mapfile -t DependenciesArray < $DependenciesPath
DependenciesArray+=('Infra')
export dependencies=$(echo '%s\n' "${DependenciesArray[@]}" | jq -R . | jq -s .)
Run Code Online (Sandbox Code Playgroud)

然后我有这个代码将其传递给node.js

node /$Organization/$Repository/LocalizationHelper.js $File $astFile "$dependencies"
Run Code Online (Sandbox Code Playgroud)

问题是我在我的LocalizationHelper.js文件中得到了这个:

[
  "%s\\n Accounts Aggregates Blog Configuration Contacts Contents DataTypes Forms Geo Globalization Media Modules Navigation Podcast Seo Social Taxonomy Tracking Vlog Infra"
]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,项目并不是彼此分离的,这 …

bash arguments json

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

如何获取所有 xy 但不是 z/xy 的文件列表?

我这台机器上有很多Settings.json文件。

我使用以下方法获取所有这些人的列表:

find / -name "Settings.json" 2>&-
Run Code Online (Sandbox Code Playgroud)

但其中一些位于以Api. 例如:

/ClubApi/Settings.json
/CrmApi/Settings.json
Run Code Online (Sandbox Code Playgroud)

我想将它们全部删除,除非它们属于以Api. 我不能那样做。

我试过:

find / -name "Settings.json" 2>&- | xargs grep -v Api 
Run Code Online (Sandbox Code Playgroud)

但它不适用于过滤路径Api

我怎样才能做到这一点?

grep find filter

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

如何在此处的文档中连接结果?

我有这个脚本:

while read $item;
do
    # Some bash logic here
done <<< "$({ cat /path/to/some/file; echo; })"
Run Code Online (Sandbox Code Playgroud)

现在我还想用来find查找一些目录的名称,并将其与循环一起cat传递while

换句话说,我想:

  • cat一份文件
  • find一些目录
  • 连接结果
  • 将它们作为此处文档送入while循环

我被困在这一点上。

我想到了重复while逻辑,这不是一个好方法。我还考虑while使用函数重用循环内的逻辑。

然而,连接此处文档中的内容似乎是正确的方法。

bash find cat here-document here-string

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

如何找到包含一个或多个文件的所有目录?

我有一个目录层次结构。有些目录不包含文件,只包含其他目录。有些包含文件。

例如:

- movies
  - 2022
    - action
      - movie.mp4
      - another-movie.mp4
  - 2023
    - drama
      - movie2.mp4
  - 2024
    - thriller
      - movie3.mp4
    - movie4.mp4
Run Code Online (Sandbox Code Playgroud)

我想要一个find可以提供此结果的命令:

/movies/2022/action
/movies/2023/drama
/movies/2024
/movies/2024/thriller
Run Code Online (Sandbox Code Playgroud)

我读了这个这个这个,但我无法弄清楚find命令。

更新:目录中可以包含文件和目录。我更新了问题。例如,在2024我有一个电影和另一个目录中。结果应包含/movies/2024/movies/2024/thriller目录。

find

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

如何知道 openssh-server 已经安装了?

我使用安装脚本,这是我的两个安装命令:

function InstallChrome()
{
    if ( which google-chrome 1>/dev/null ); then
        echo "Chrome is installed"
        return
    fi

    echo "Installing Google Chrome ..."

    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O chrome
    sudo dpkg -i chrome

    echo "Installed Google Chrome"
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我会搜索安装的程序apt,如果它存在,我不会运行apt命令。

原因是它比让支票快得多apt

然而,这段代码不起作用:

function InstallSshServer()
{
    if ( which openssh-server 1>/dev/null ); then
        echo "SSH Server is installed"
        return;
    fi

    echo "Installing SSH Server ..."

    sudo apt install openssh-server -y

    echo "Installed SSH Server"
}
Run Code Online (Sandbox Code Playgroud)

我的机器上安装的程序的名称是什么openssh-server?如何检查它是否已经安装?

openssh apt

0
推荐指数
1
解决办法
1296
查看次数

为什么这个循环是针对空集执行的?

创建一个空目录,然后运行以下代码:

find /empty_directory -mindepth 1 -maxdepth 1 -type d |
while read dir;
do
    echo "Simple find: $dir"
done

printf '%s\n' '-----'                   # Safer than    echo -----

while read dir;
do
    echo "HereDoc find: $dir"
done <<< "$(find /empty_directory -mindepth 1 -maxdepth 1 -type d)"
Run Code Online (Sandbox Code Playgroud)

这是输出:

-----
HereDoc find: 
Run Code Online (Sandbox Code Playgroud)

换句话说,第二个循环使用空变量执行一次。

为什么会这样呢?当没有发现循环的目录时,如何使第二个循环行为正确并且不运行?

bash find here-document

0
推荐指数
1
解决办法
344
查看次数

如何将 Debian 11 升级到 Debian 12?

这个问题听起来可能很简单,但我找不到将 Debian 11 升级到 12 的命令。

我试过了apt updateapt upgrade还有apt dist-upgradeapt full-upgrade还有什么没有。

他们都没有改变版本。每次使用后cat /etc/os-release我都会看到 11(靶心)。

如何升级到 Debian 12(书虫)?

debian apt

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

标签 统计

bash ×8

find ×6

apt ×2

filter ×2

here-document ×2

arguments ×1

cat ×1

debian ×1

echo ×1

function ×1

grep ×1

here-string ×1

json ×1

newlines ×1

openssh ×1

ps ×1

shell ×1

subshell ×1

time ×1

wait ×1

wc ×1