我尝试查找*.e*
与另一个文件 ( md.tpr
)位于同一目录中的一些文件 ( )。我需要使用以下内容列出它们(用于进一步处理):
find . -name md.tpr -execdir ls *.e* \;
Run Code Online (Sandbox Code Playgroud)
我尝试了此命令的一些变体和其他一些变体(包括单引号传递给的命令-execdir
或将其作为sh -c 'ls *.e*'
或eval 'ls *.e*'
仅举几例)。似乎通配符在传递给-exec
或时不起作用-execdir
。运行上述命令时出现的错误是:
ls: *.e*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
就像一个健全性检查一样,我做-execdir pwd
了它并打印了它应该打印的内容,所以看起来它是 globbing 的问题,因为这些*.e*
文件确实存在于这个测试列出的目录中。
现在,我能够以一种不太优雅的方式解决这个问题,但它让我感到困惑,为什么通配符和通配符在这里不起作用。有任何想法吗?还是我完全偏离了轨道?
我使用 bash 3.2.25(旧的,但我在该系统上没有管理员权限)。
另外,有趣的是,如果我这样做
find ~ -name .bashrc -maxdepth 2 -execdir ls -d .b* \;
Run Code Online (Sandbox Code Playgroud)
除非从$HOME
.
我编写了两个函数push
,pull
用于将文件复制到目录 ( $FILE_EXCHANGE_DIR
)和从目录复制文件。当我使用该pull
功能时,我希望 bash 自动完成该目录中的名称。我希望自动完成功能仅从上述目录中获取名称。在当前表单中,我的自动完成功能还会查找当前目录中的文件名,无论源目录 ( $FILE_EXCHANGE_DIR
)中是否存在匹配项。
这是我传递给 的函数的两个版本complete
。他们都没有工作。
_pull () {
local cmd="${1##*/}";
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )
local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )
COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
return 0;
}
_pull ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
local pat="$FILE_EXCHANGE_DIR/*"
COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,我做
complete -f -F _pull …
Run Code Online (Sandbox Code Playgroud) 我有一个涉及 NIS 和autofs
. 我从 NFS 服务器中提取我的主目录。一切正常,除了我必须手动重新启动nis
和autofs
每次重新启动后。所以在系统启动后,我需要切换到控制台(或 ssh 进入机器)并执行
sudo service nis restart
sudo service autofs restart
Run Code Online (Sandbox Code Playgroud)
在此之后,一切都像魅力一样,没有问题。
如果我不这样做,我将无法通过登录屏幕。举个例子,我在系统上有两个用户,分别调用它们localuser
(机器上的密码和主目录)和remoteuser
(远程机器上的密码,NFS 上的主目录)。现在,重新启动后,我可以毫无问题地登录localuser
。如果我尝试以 登录remoteuser
,我的密码会被接受,但没有找到主目录,所以如果我尝试使用 GNOME 登录,我会立即退出。我仍然可以登录的remoteuser
远程或切换到文本终端(后ctrl
+ alt
+ f1
),但没有主目录中找到。重新启动 NIS 后,autofs
如上所述,在重新启动之前,我可以像remoteuser
没有其他问题一样登录。
所以我的问题是:如何避免在每次重新启动后手动重新启动这些服务?
我一直将这台计算机用作独立机器,然后将其移至网络,因此我想在安装autofs
.
我使用的是 Ubuntu 12.04,但我在另一台运行旧版本 Ubuntu 的机器上遇到了类似的问题。
我一直在尝试处理find
with的输出parallel
,这反过来又调用了一个shell(需要一些文本替换)。我观察到一些奇怪的行为,我无法真正向自己解释。
在每个目录中有一堆文件,将它们称为file1.xtc
, file2.xtc
. 其中一些具有诸如file1.part0002.xtc
等名称。如果从其传递的文件find
具有该*.part000x.*
名称,则我需要删除该*.part000x.*
位,以便生成的命令类似于
command -f file1.part0001.xtc -s file1.tpr
Run Code Online (Sandbox Code Playgroud)
我使用find
和parallel
达到这个效果,但是parallel
的替换(特别是{.}
位)还不够(他们删除了.xtc
扩展名,留下了.part0001
单独的),所以这是我用来检查输出的命令:
find 1st 2nd 3rd -name '*.xtc' -print0 | parallel -0 sh -c 'name=""; name="{.}"; echo {.} ${name%.*}.tpr'
Run Code Online (Sandbox Code Playgroud)
如果我使用上面的命令,首先声明name
并为其分配一个空字符串(或其他任何内容),结果是
file1.part0001 file1.tpr
Run Code Online (Sandbox Code Playgroud)
根据需要(这些是我需要用于命令的名称)。但是,如果我运行这个
find 1st 2nd 3rd -name '*.xtc' -print0 | parallel -0 sh -c 'name="{.}"; echo {.} ${name%.*}.tpr'
Run Code Online (Sandbox Code Playgroud)
结果是:
file1.part0001 .tpr
Run Code Online (Sandbox Code Playgroud)
或者它表现得好像 …
我想编写一个脚本来显示一条消息并可能取消从交互式 shell 的注销。这是因为我经常在我的一些 shell 中运行后台作业,并且在我从所有 shell 中注销时一时冲动,关闭正在运行的作业。我所追求的是一个脚本,如:
# If there are running jobs
if [ -z "$(jobs)" ]; then
# Display messages, give choices, etc.
...code...
# And finally, given some conditions (e.g. answers to questions, etc.)
cancel_logout
else
logout
Run Code Online (Sandbox Code Playgroud)
据推测,上述内容将进入~/.bash_logout
.