我有大量包含\
我想要操作的反斜杠的文件,但每当我尝试类似的操作时:
$ ls -li
2036553851 -rw-rw-r-- 1 user user 6757 May 20 00:10 Simplex_config\\B1:B3\\_1.csv
2036553766 -rw-rw-r-- 1 user user 6756 May 20 00:07 Simplex_config\\B1:B3\\_2.csv
2036554099 -rw-rw-r-- 1 user user 6785 May 20 00:20 Simplex_config\\B1:B3\\_3.csv
2036553974 -rw-rw-r-- 1 user user 6785 May 20 00:15 Simplex_config\\B1:B3\\_4.csv
$ find . -type f -name 'Simplex*.csv' | xargs cat > looksee.txt
我收到一个No such file or directory
错误。我考虑过更改文件名然后进行操作,但我很好奇是否有更简单的解决方案inode
。
我想出了:
#!/bin/sh
if [ -f looksee.txt ]; then
rm -rf looksee.txt
fi
ls -i Simplex_config*.csv | awk '{ print $1 }' > inode_list.txt
while IFS= read -r inode;
do
find . -inum $inode -exec cat {} \; >> looksee.txt
done < inode_list.txt
但这非常麻烦,我想尝试找到一种方法来解析输出ls -i Simplex_config*.csv
并将其通过一行程序传送到另一个命令 - 是否有这样的选项可用?
答案1
1.
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
从男人xargs
- 无效的
-0
输入项以空字符而不是空格终止,并且引号和反斜杠并不特殊(每个字符均按字面意思理解)。禁用文件结尾字符串,该字符串的处理方式与任何其他参数一样。当输入项可能包含空格、引号或反斜杠时很有用。 GNUfind -print0
选项生成适合此模式的输入。
2.
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
从人发现
-执行命令;
执行命令;如果返回 0 状态则为 true。 find 的所有以下参数都被视为命令的参数,直到;
遇到由以下组成的参数。该字符串{}
将被替换为当前文件名,该文件名出现在命令的参数中,而不仅仅是出现在单独的参数中,如某些版本的 find 中。这两种结构可能都需要转义(用\
)或引用,以保护它们免受 shell 的扩展。对于每个匹配的文件,指定的命令运行一次。该命令在起始目录中执行。使用过程中存在不可避免的安全问题-执行行动;你应该使用-execdir选项代替。-执行命令{} +
这个变体的-执行操作对选定的文件运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建的;该命令的调用总数将远小于匹配的文件数。命令行的构建方式与 xargs 构建其命令行的方式大致相同。{}
命令中只允许出现一个 的实例。该命令在起始目录中执行。
3.
cat Simplex_config* > looksee.txt
如果您只有 1 级子路径。
答案2
您不能通过索引节点访问文件,因为这会破坏通过权限进行的访问控制。例如,如果您没有遍历目录的权限,那么无论该文件的权限是什么,您都无法访问该目录中的任何文件。如果您可以通过索引节点访问文件,那么就会绕过目录权限。
因此,虽然您可以获得文件的设备和索引节点号,但您需要找到文件的路径才能对其进行操作。 (A路径,不这路径,因为如果文件有多个硬链接,则可以有多个路径。)这意味着如果您使用 inode,您将始终有更多工作要做。查看 inode 的唯一原因是如果您想了解硬链接并仅对具有多个硬链接的每个文件执行一次操作。
您find
可以通过使用-print0
和xargs -0
(如果您的系统上可用)或使用-exec
命令。有关更多信息,请参阅为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
答案3
@Costas 已经给了你最好的答案,重播你的第二个问题
但这非常麻烦,我想尝试找到一种方法来解析 ls -i Simplex_config*.csv 的输出并将其通过单行管道传输到另一个命令 - 是否有这样的选项可用?
你可以只使用 xargs:
ls -i | cut -d ' ' -f 1 | xargs -I '$input' find -inum '$input' -exec cat {} \;
该-I
选项允许您指定一个字符串以替换为从标准输入读取的内容。