Answers:
这就是您要寻找的:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
这样做的原因find
不是ls
因为通常分析ls
输出是不可靠的。find
但是,使用的这种形式即使文件名包含换行符或其他困难字符也可以使用文件名。
说明
find . -maxdepth 1 -type f -print0
这将选择文件。可以使用find的许多选项中的任何一个进行自定义。该选项print0
指示find
以空分隔列表打印文件名。这是传输文件名列表的唯一可靠方法。
xargs -L1 -p0 chmod +x
这将使用由生成的文件名分隔的空列表,find
并将您的命令应用于它们。
该-L1
选项告诉xargs
您一次只能处理一个文件名。该-p
选项告诉xargs
您在继续之前提示批准。该-0
选项指示xargs
使用空字符作为文件名之间的分隔符。
[ 直到@kwan指出之前,我一直不知道该-p
选择xargs
。
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
因此可以和-maxdepth 1
之前的-type f
as一起使用find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
。
您可以使用xargs
。
例如:
ls|xargs -I path -p chmod +x path
选项-p
: 提示用户是否运行每个命令行并从终端读取一行。如果响应以“ y”或“ Y”开头,则仅运行命令行。
xargs -p
因此我会复制它。
touch "a very long file name
并按Enter。查看继续行,只需键入右引号,然后再次按Enter。tadaa,文件名中的换行符。懒惰地重新输入长文件名。
find
使用来使命令POSIX兼容-exec printf '%s\0' {} +
。但是,不要认为有任何方法可以使整个POSIX兼容。