小编Woj*_*tek的帖子

查找和通配符(和通配符)

我尝试查找*.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.

bash find

15
推荐指数
2
解决办法
3万
查看次数

bash中不同目录中的完整文件

我编写了两个函数pushpull用于将文件复制到目录 ( $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)

bash autocomplete

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

重新启动后 nis 和 autofs 手动重新启动

我有一个涉及 NIS 和autofs. 我从 NFS 服务器中提取我的主目录。一切正常,除了我必须手动重新启动nisautofs每次重新启动后。所以在系统启动后,我需要切换到控制台(或 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 的机器上遇到了类似的问题。

nis autofs

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

并行变量声明 sh -c ...

我一直在尝试处理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)

我使用findparallel达到这个效果,但是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)

或者它表现得好像 …

bash find variable gnu-parallel

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

让用户取消 shell 注销的脚本

我想编写一个脚本来显示一条消息并可能取消从交互式 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.

bash ssh logout

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

标签 统计

bash ×4

find ×2

autocomplete ×1

autofs ×1

gnu-parallel ×1

logout ×1

nis ×1

ssh ×1

variable ×1