有没有一行命令可使chmod具有交互性?


24

我正在寻找类似的东西:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

或类似的语法。

也可以在您要单独确认的其他命令上使用。

Answers:


45

这就是您要寻找的:

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使用来使命令POSIX兼容-exec printf '%s\0' {} +。但是,不要认为有任何方法可以使整个POSIX兼容。
l0b0 2015年

这个语法给了我一个警告,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 fas一起使用find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
哈维

@Harvey您是正确的:我更新了答案以删除该警告。
John1024

25

您可以使用xargs

例如:

ls|xargs -I path -p chmod +x path

选项-p提示用户是否运行每个命令行并从终端读取一行。如果响应以“ y”或“ Y”开头,则仅运行命令行。


1
+1我非常喜欢您的使用方式,xargs -p因此我会复制它。
John1024

1
完善!并使大多数命令交互的非常简单的方法。谢谢。
哈维2015年


@Kroltan-为什么有人会在文件名中使用换行符?
nbubis

1
@nbubis可能会发生:转到终端并键入touch "a very long file name并按Enter。查看继续行,只需键入右引号,然后再次按Enter。tadaa,文件名中的换行符。懒惰地重新输入长文件名。
Kroltan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.