首页 > 解决方案 > 带有变量的 rm:一个有效,下一个无效

问题描述

这真的让我发疯。我已阅读并尝试过其他问题/答案,例如:

但我无法让它工作。最奇怪的部分是,第一个“rm”工作得很好,但第二个什么也没做。

我正在制作一个 git-hook,以更新 Directadmin 中的自定义文件。

我的脚本以

#!/bin/bash
dirDaBase="/usr/local/directadmin/"
dirDeploy="/path/to/source/files/"

第一部分效果很好:

#### de custom files
###########################################################################
dirDA="${dirDaBase}data/templates/custom/"
dirSource="${dirDeploy}data/templates/"

showTitle "Deploy custom files to ${dirDA}"
showDir $dirDA

show "remove old files"
sudo rm -fv "${dirDA}"*.* 2>&1 | showResult
showDir $dirDA

sudo cp "${dirSource}"*.* "${dirDA}" 2>&1 | showResult

fixPermissionsFromRoot $dirDA diradmin diradmin
showReady "custom files"

注意!通常我使用rm -rf

和是showXX辅助fixPerm...函数

我们总是用斜杠结束路径变量......

在下一部分rm不起作用。没有与结尾斜杠一起工作
dirDA由于阅读了其他问题/答案,我从下一个中删除了结尾斜杠dirDA,希望能解决它,但它没有...... :-(

我尝试了几种格式...如您所见

#### custom scripts
###########################################################################
dirDA="${dirDaBase}scripts/custom"
dirSource="${dirDeploy}data/scripts/"

showTitle "Deploy scripts to ${dirDA}"
showDir $dirDA

show "remove old scripts try 1"
#without quotes
sudo rm -v $dirDA/*.sh 2>&1 | showResult
showDir $dirDA
show "remove old scripts try 2"
#with quotes and *.sh
sudo rm -v "${dirDA}"/*.sh 2>&1 | showResult
showDir $dirDA
show "remove old scripts try 3"
#with quotes and *.*
sudo rm -v "${dirDA}"/*.* 2>&1 | showResult
showDir $dirDA

sudo cp "${dirSource}"*.sh "${dirDA}"/ 2>&1 | showResult

fixPermissionsFromRoot $dirDA diradmin diradmin
showReady "scripts"

第一部分的输出:

************************************
deploy files to DA
************************************
Deploy custom files to /usr/local/directadmin/data/templates/custom/
list files from: /usr/local/directadmin/data/templates/custom/
total 112
drwxr-xr-x   2 diradmin diradmin  4096 May 18 13:32 .
drwx--x--x. 10 diradmin diradmin  4096 May 16 10:33 ..
-rw-r--r--   1 diradmin diradmin   106 May 18 13:32 cust_nginx.CUSTOM.1.post
  <....>
-rw-r--r--   1 diradmin diradmin  4431 May 18 13:32 rhBasic_paths.map.conf

remove old files
removed ‘/usr/local/directadmin/data/templates/custom/cust_nginx.CUSTOM.1.post’
  <....>
removed ‘/usr/local/directadmin/data/templates/custom/rhBasic_paths.map.conf’

list files from: /usr/local/directadmin/data/templates/custom/
total 8
drwxr-xr-x   2 diradmin diradmin    6 May 18 13:35 .
drwx--x--x. 10 diradmin diradmin 4096 May 16 10:33 ..


************************************
Fix root permissions to diradmin:diradmin
list files from: /usr/local/directadmin/data/templates/custom/
total 112
drwxr-xr-x   2 diradmin diradmin  4096 May 18 13:35 .
drwx--x--x. 10 diradmin diradmin  4096 May 16 10:33 ..
-rw-r--r--   1 root     root       106 May 18 13:35 cust_nginx.CUSTOM.1.post
  <....>
-rw-r--r--   1 root     root      4431 May 18 13:35 rhBasic_paths.map.conf
fixed root permissions
list files from: /usr/local/directadmin/data/templates/custom/
total 112
drwxr-xr-x   2 diradmin diradmin  4096 May 18 13:35 .
drwx--x--x. 10 diradmin diradmin  4096 May 16 10:33 ..
-rw-r--r--   1 diradmin diradmin   106 May 18 13:35 cust_nginx.CUSTOM.1.post
  <....>
-rw-r--r--   1 diradmin diradmin  4431 May 18 13:35 rhBasic_paths.map.conf
Ready fixPermissions
------------------------------------
Ready custom files
------------------------------------

第二部分的输出:



************************************
Deploy scripts to /usr/local/directadmin/scripts/custom
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:32 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:32 user_create_post.sh

remove old scripts try 1
rm: cannot remove ‘/usr/local/directadmin/scripts/custom/*.sh’: No such file or directory
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:32 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:32 user_create_post.sh

remove old scripts try 2
rm: cannot remove ‘/usr/local/directadmin/scripts/custom/*.sh’: No such file or directory
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:32 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:32 user_create_post.sh

remove old scripts try 3
rm: cannot remove ‘/usr/local/directadmin/scripts/custom/*.*’: No such file or directory
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:32 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:32 user_create_post.sh

************************************
Fix root permissions to diradmin:diradmin
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:35 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:35 user_create_post.sh
fixed root permissions
list files from: /usr/local/directadmin/scripts/custom
total 20
drwx------  2 diradmin diradmin   76 May 18 12:59 .
drwx--x--x. 4 diradmin diradmin 4096 Apr 25 11:43 ..
-rwx------  1 diradmin diradmin  161 May 18 13:35 domain_create_post.sh
-rwx------  1 diradmin diradmin 6295 Apr  4 17:38 README
-rwx------  1 diradmin diradmin  158 May 18 13:35 user_create_post.sh
Ready fixPermissions
------------------------------------
Ready scripts
------------------------------------

什么,我做错了什么??(我希望这不是一个愚蠢的错字)

我知道我也可以使用 find 和 grep 等,如其他答案中所述。但是为什么第一个脚本有效而第二个脚本无效?

在此先感谢,flexJoly

标签: linuxbash

解决方案


这仅适用于 GNU sed:-

find "${dirDA}"\*.sh > stack

while [ $(wc -l stack | cut -d' ' -f1) -gt 0 ]
do
filename=$(sed -n '1p' stack)
sudo rm -v "${filename}" 2>&1 | showResult
sed -i '1d' stack
done

这里使用find来列出要删除的文件,将它们输出到堆栈文件中,将它们从堆栈中拉出,并用rm一个一个地删除它们。

每当我处理多个文件时,我发现设置这样的循环更容易,因为这样每个文件都会被单独处理,我不必担心 rm 或任何其他命令将如何解释掩码,或者它是否会绊倒他们。


推荐阅读