我尝试查找*.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 的机器上遇到了类似的问题。
我一直在尝试处理findwith的输出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.