Linux:对一批文件运行命令,并匹配输出文件

Linux:对一批文件运行命令,并匹配输出文件

一个简单的任务:给定一个文件目录和一个以一个文件作为输入并生成一个文件作为输出的命令,我想一次处理目录中的所有文件并以相应的匹配名称(带有新的扩展名)输出它们。

因此如果命令通常是:

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

搜索所有以.extin结尾/path/to/folder但不在子文件夹中的文件。该-exec部分告诉 find 命令如何处理它找到的每个文件。{}然后每个出现的 都会被替换为文件。模式是

find /path/to/folder -iname \*.ext -exec echo "found this file: {}" \;

正如我所说,{}扩展为找到的文件的名称。\;标记参数的结尾-execsh -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 脚本,但如果你愿意,你可以直接将其输入到终端中;你不必将其放入文件中:

cddirectory_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

相关内容