当前位置: 首页 > 知识库问答 >
问题:

Linux 查找命令隐藏基目录

朱啸
2023-03-14

编者按:这个问题是模棱两可的,因为它混淆了两个不相关的任务:
(a)使用-printf操作打印仅仅的文件名(没有路径组件),以及
(b)通过{}
(a)在-exec操作的上下文中传递仅仅的文件名作为参数被错误地认为是实现(b)的一种方式。
这种混淆导致至少有一个答案集中在(a)上。

我试图使用查找命令列出某个路径中的所有目录,但在输出中隐藏该路径。-printf"%P\n"标志应该隐藏 /path/to/directory/,但它不起作用:

find /path/to/directory/* -maxdepth 0 -type d -printf "%P\n" -exec sudo tar -zcpvf {}.tar.gz {} \;

例如,上面的命令将使用以下内容创建归档文件:

/path/to/directory/dir1
/path/to/directory/dir2
/path/to/directory/dir3

如何修改我的命令以输出此:

dir1
dir2
dir3

请注意:我知道我可以通过cd /path/to/directory/然后使用查找命令执行上述操作,但重要的是我要避免使用cd并使用单个查找命令执行所有操作。

共有2个答案

家经纶
2023-03-14

由于您只处理子目录(直接子目录),因此 shell 循环可能是更简单的解决方案:

(cd "/path/to/dir" && for d in */; do sudo tar -zcpvf "${d%/}".tar.gz "$d"; done)

我知道你想避免cd,但是通过将整个命令包含在(...)中,它在子壳中运行,因此当前shell的工作目录保持不变。

本答案的其余部分讨论了如何使用 GNU 查找来解决问题

< sup > < code >-execdir 解决方案也可以与BSD/OSX find一起使用,而且实际上会更简单。

至于让 find-printf 只打印文件名,而不输出任何目录组件:使用 %f 格式说明符:

find /path/to/dir/* -maxdepth 0 -type d -printf "%f\n"

这将打印指定目录中所有直接子目录的名称。

但是,当使用-exec操作时,打印的内容不会影响{}>扩展到的内容:{{}始终扩展到匹配的路径,其中始终包括指定为输入的路径组件。

但是,< code>-execdir操作可能会满足您的要求:

>

  • 在执行指定的命令之前,它会更改为手头的目录

    它将< code>{}扩展为< code >。/

    因此:

    find /path/to/dir -mindepth 1 -maxdepth 1 -type d -execdir sudo tar -zcpvf {}.tar.gz {} \;
    

    警告:<code>-execdir{}仍然按原样扩展到输入路径。

    因此,上面的命令没有将globing(/path/to/dir/*)与-maxDeep 0一起使用,而是使用/path/to/dir并让查找对包含的项目进行枚举,这些项目比级别1-因此-maxDeep 1;由于输入路径本身不应包含在内,因此必须添加-minDeep 1

    请注意,行为有细微的不同:<code>find</code>总是在枚举中包含隐藏项,而shell的globbing(<code>*</code>)默认情况下不包含。

    如果<code>/ {}扩展中的code>前缀应该去掉,需要做更多的工作:

    find /path/to/dir -mindepth 1 -maxdepth 1 -type d \
      -execdir sh -c 'd=${1##*/}; sudo tar -zcpvf "$d".tar.gz "$d"' - {} \;
    

    涉及shell(sh)允许使用shell参数扩展来剥离./前缀(${1##*/}实际上会剥离任何路径组件)。请注意虚拟参数-,shell将其分配给0美元,我们对此不感兴趣;{}然后变成shell参数1美元

    [1]加上./,如果输入路径本身是相对的;请注意,BSD/OSX查找没有表现出这种怪癖:它总是将{}扩展到仅仅是文件名,没有任何路径组件。

  • 姬俊远
    2023-03-14
    find  /path/to/directory/* -maxdepth 0 -type d -exec basename {} \;
    

    查找所有目录 查找 /路径/到/目录/* -最大深度 0 -类型 d

    < code >-exec basename { } \; -使用find中的结果参数执行basename命令

     类似资料:
    • 使用 chattr 命令配置文件或目录的隐藏属性后,可以使用  lsattr 命令查看。 lsattr 命令,用于显示文件或目录的隐藏属性,其基本格式如下: [root@localhost ~]# lsattr [选项] 文件或目录名 常用选项有以下 3 种: -a:后面不带文件或目录名,表示显示所有文件和目录(包括隐藏文件和目录) -d:如果目标是目录,只会列出目录本身的隐藏属性,而不会列出所含

    • 管理 Linux 系统中的文件和目录,除了可以设定普通权限和特殊权限外,还可以利用文件和目录具有的一些隐藏属性。 chattr 命令 ,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用。该命令的基本格式为: [root@localhost ~]# chattr [+-=] [属性] 文件或目录名 + 表示给文件或目录添加属性,- 表示移除文件或目录拥有的某些属性,= 表示给文件或目录

    • 常用指令 - ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) ls -a 或者 ls -al mkdir 创建目录 -p 创建目录,若无父目录,则创建p(parent)(循环创建) mkdir dirname 或者 mkdir -p dirname/dirname2/dirname cd 切换目录

    • 问题内容: 我知道命令行界面(例如Git等)能够隐藏用户的输入(对于密码有用)。有没有办法用Java编程地做到这一点?我正在从用户那里输入密码,我希望他们的输入在该特定行(而不是所有用户)上被“隐藏”。这是我的代码(尽管我怀疑这会有所帮助…) 问题答案: 尝试。不过,您至少必须运行Java 6。 请注意,这不适用于Eclipse控制台。您必须从 真实的 console / shell / term

    • 通过学习 cd 和 pwd 命令,相信读者已经能够在庞大的 Linux 文件系统中,随心所欲地游荡并确定自己所在的位置了。本节继续来学习,如何知道某目录中存放了哪些文件或子目录。 ls 命令,list 的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。此命令的基本格式为: [root@localhost ~]# ls [选项] 目录名称 表 1 列出了 ls 命令常用的选项以及各自

    • 本文向大家介绍LINUX 查找tomcat日志关键词命令,包括了LINUX 查找tomcat日志关键词命令的使用技巧和注意事项,需要的朋友参考一下 #查询catalina.out日志文件中的关键词为2016-04-13 11:26:00的日志信息 grep -C 10 '2016-04-13 11:26:00' catalina.out |more 解释: grep :查询,筛选 -C : gre