Linux Find命令隐藏基本目录
Linux Find命令隐藏基本目录
编辑注:这个问题不明确,因为它混淆了两个无关的任务:
(a) 使用-printf
命令打印仅文件名(不包含路径组件),以及
(b) 在-exec
命令的上下文中将仅文件名作为参数传递,使用{}
(a) 错误地被认为是实现(b)的一种方式。
这种混淆导致至少有一个答案关注于(a)。
我正在尝试使用find命令列出特定路径中的所有目录,但在输出中隐藏该路径。-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/然后使用find命令来完成上述操作,但重要的是我要避免使用cd,并且要全部使用单个find命令。
Linux Find命令隐藏基本目录
在处理只有子目录(即直接子目录)的情况下,一个更简单的解决方法是使用shell循环:
(cd "/path/to/dir" && for d in */; do sudo tar -zcpvf "${d%/}".tar.gz "$d"; done)
尽管你想避免使用`cd`命令,但通过将整个命令包含在括号中`(...)`,它将在一个子shell中运行,因此当前shell的工作目录保持不变。
解决这个问题的GNU find的方法如下:
find /path/to/dir/* -maxdepth 0 -type d -printf "%f\n"
这将打印指定目录中所有直接子目录的名称。
然而,打印的内容对于使用`-exec`操作时`{}`的展开没有影响:`{}`始终展开为匹配的路径,其中包括输入指定的路径组件。
然而,`-execdir`操作可能会给你想要的结果:
- 它在执行指定命令之前切换到指定的目录。
- 它将`{}`展开为`./
因此:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d -execdir sudo tar -zcpvf {}.tar.gz {} \;
注意:`-execdir`只对输入路径的后代文件起作用;对于输入路径本身,`{}`仍然展开为输入路径本身。因此,上述命令不使用通配符(`/path/to/dir/*`)和`-maxdepth 0`,而是使用`/path/to/dir`并让`find`枚举其中的项目,这些项目位于第1级,因此使用`-maxdepth 1`;由于输入路径本身不应包含在内,必须添加`-mindepth 1`。
注意,行为略有不同:`find`始终包括枚举中的隐藏项,而shell的通配符(`*`)默认情况下不包括隐藏项。
如果要删除`{}`展开中的`./`前缀,需要更多的工作:
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`。
这几乎可以工作!但是它在前面放置了一个丑陋的空目录,例如:`./dir/filename.txt`。有没有办法删除`./`,使输出只有`dir/filename.txt`?
是的,`tar`工作正常,但是我在我的存档中得到的是`./dir1 ./dir2`,而不是`dir1 dir2`。
似乎是一个拼写错误;在`-exec`之后的某个地方,你没有引用的`/` - 也许你忘记了shell命令周围的单引号?
Linux Find Command Hide Base Directory是一个关于Linux中find命令的问题。下面是这个问题的出现原因和解决方法。
问题的出现原因是:用户使用了find命令来查找指定路径下的所有目录,并使用了-exec参数来执行basename命令,但是没有指定基本目录。
问题的解决方法是:在find命令中加入基本目录参数,以解决这个问题。具体的解决方法有两种:
方法一:在find命令中使用基本目录参数
find /path/to/directory/* -maxdepth 0 -type d -exec basename {} \;
方法二:使用GNU的find命令
find /path/to/directory/* -maxdepth 0 -type d -printf '%f\n'
使用这两种方法都可以解决问题,具体选择哪种方法取决于用户的需求和环境。
总结起来,Linux Find Command Hide Base Directory的问题出现的原因是没有指定基本目录参数,解决方法是在find命令中加入基本目录参数或者使用GNU的find命令。希望这篇文章对大家理解和解决这个问题有所帮助。