在此脚本中,将拉取所有 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。
为什么会这样?我该如何解决?
我有一个Top命令可以用来查看服务器中发生的情况:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
Run Code Online (Sandbox Code Playgroud)
基本上它正在使用ps并删除一堆列。
对于每个进程 ID,我可以用来pwdx查看源目录在哪里。
但是,我坚持将 加入pwdx到上面命令的输出以将其添加为列。
你能帮忙吗?
基于这个答案,为了测量我的 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 中,我们无法从函数返回值。我们只能返回数字。
有没有办法将上面的代码简化为下面的代码?
我想查看使用该命令找到的每个文件中存在多少行find。
我知道我可以用来wc -l查找单个文件的行数。但是,当从以下输出进行管道传输时,这不起作用find:
find -type f -name package.json | wc -l
Run Code Online (Sandbox Code Playgroud)
这将返回找到的文件的计数。我想返回每个找到的文件的行数。
我想找到所有已命名的目录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 脚本的时间。
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 不要向其中追加另一行?
我知道很多人都问过类似的问题,但我无法使其发挥作用。
我有一个名为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)
正如您所看到的,项目并不是彼此分离的,这 …
我这台机器上有很多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。
我怎样才能做到这一点?
我有这个脚本:
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使用函数重用循环内的逻辑。
然而,连接此处文档中的内容似乎是正确的方法。
我有一个目录层次结构。有些目录不包含文件,只包含其他目录。有些包含文件。
例如:
- 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)
更新:目录中可以包含文件和目录。我更新了问题。例如,在2024我有一个电影和另一个目录中。结果应包含/movies/2024和/movies/2024/thriller目录。
我使用安装脚本,这是我的两个安装命令:
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?如何检查它是否已经安装?
创建一个空目录,然后运行以下代码:
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)
换句话说,第二个循环使用空变量执行一次。
为什么会这样呢?当没有发现循环的目录时,如何使第二个循环行为正确并且不运行?
这个问题听起来可能很简单,但我找不到将 Debian 11 升级到 12 的命令。
我试过了apt update,apt upgrade还有apt dist-upgrade,apt full-upgrade还有什么没有。
他们都没有改变版本。每次使用后cat /etc/os-release我都会看到 11(靶心)。
如何升级到 Debian 12(书虫)?