一个简单的任务:给定一个文件目录和一个以一个文件作为输入并生成一个文件作为输出的命令,我想一次处理目录中的所有文件并以相应的匹配名称(带有新的扩展名)输出它们。
因此如果命令通常是:
convert -input sourceFile.ext -output destFile.out
我想处理一个文件夹
file1.ext, file2.ext, etc.
并在同一目录中生成文件
file1.out, file2.out, etc.
有没有办法在终端中执行此操作而无需编写 bash 脚本?我对脚本不太熟悉,因此任何简单的解决方案都会受到赞赏。
答案1
不使用basename
:
for file in *.ext; do convert -input "$file" -output "${file/%ext/out}"; done
看http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
答案2
查看find
命令
请确保cd
进入您的输入目录。
cd input_directory
find . -iname "*.ext" -exec convert -input {} -output {}.out \;
这会将其.out
附加到输入文件的名称中。我还没有弄清楚如何获取所述的输出文件。
在运行改变事物的find
操作之前尝试一下会发生什么总是明智的。-exec
cd input_directory
find . -iname "*.ext" -type f -exec ls -l {} \;
将会进行某种“试运行”。
-exec
运行什么命令{}
找到了什么文件;一次一个\;
需要用这个来结束-exec
我的有限实验表明你不需要引用 {}
$ find . -type f -exec ls -bl {} \;
-rw-r--r--. 1 me me 0 Oct 20 19:03 ./a\ b\ c.txt
-rw-r--r--. 1 me me 0 Oct 20 19:03 ./abc.txt
$ ls -bl
total 0
-rw-r--r--. 1 me 0 Oct 20 19:03 a\ b\ c.txt
-rw-r--r--. 1 me 0 Oct 20 19:03 abc.txt
me ~/a $`
我有一个文本文件 help.txt,其中包含所有我难以记住的 bash 命令的提示。我将其与一个简单的脚本绑定,以打印出文件 ..,h
以下是我的查找命令的列表:
# searches for all files on the system for the string you fill in between the ""
sudo find / -type f -exec grep -il "" {} \;
# search for all files starting with python.
find / -iname 'python*'
# search for the file type .jpeg and sort the list by date
find ~ -iname "*.jpeg" -type f -exec ls -l {} \; 2>/dev/null | sort -r -k 8,8 -k 6,7M
# so I can remember the or syntax.
find ~ \( -iname "*.jpeg" -o -iname "*.png" \) -type f -exec ls -l {} \;
答案3
试试这个(只有一行):
find /path/to/folder -maxdepth 1 -iname \*.ext -exec sh -c 'convert -input "{}" -output "/path/to/folder/$(basename "{}" .ext).out"' \;
具体细节如下:
find /path/to/folder -maxdepth 1 -iname \*.ext
搜索所有以.ext
in结尾/path/to/folder
但不在子文件夹中的文件。该-exec
部分告诉 find 命令如何处理它找到的每个文件。{}
然后每个出现的 都会被替换为文件。模式是
find /path/to/folder -iname \*.ext -exec echo "found this file: {}" \;
正如我所说,{}
扩展为找到的文件的名称。\;
标记参数的结尾-exec
。sh -c
在这种情况下使用 ,因为否则命令$(basename {} .ext)
会被 shell 过早扩展。 因此我们将其括在单引号中以防止扩展并将其传递给 shell 的另一个实例。{}
将由 扩展find
,命令的其余部分将逐字传递给sh
。 命令
$(basename "filename.ext" .ext).out
将从中删除扩展名"filename.ext"
,然后附加.out
扩展名。
编辑:
我刚刚意识到这个命令看起来有多么难以理解。这是它的最基本版本。
find . -name \*.ext -exec sh -c 'convert -input {} -output $(basename {} .ext).out' \;
它几乎这次无需滚动即可适应。:)
答案4
这取决于你所说的“编写 bash 脚本”是什么意思。以下是一个 bash 脚本,但如果你愿意,你可以直接将其输入到终端中;你不必将其放入文件中:
cd
directory_where_the files_are
for x in *.ext
do
convert -input "$x" -output $(basename "$x" .ext).out
done
这将仅对*.ext
目录中的文件进行操作cd
。如果您还想搜索子目录,find
这是最好的解决方案;例如,使用nispio 的回答但省略了-maxdepth 1
。
编辑:Hennes 对 nispio 答案的评论也适用于此;你可以说
for x in /path/to/folder/*.ext
do
convert -input "$x" -output $(basename "$x" .ext).out
done